* [patch 6/28] Sync up drivers/scsi/aic7xxx
@ 2004-09-28 13:04 Luben Tuikov
0 siblings, 0 replies; only message in thread
From: Luben Tuikov @ 2004-09-28 13:04 UTC (permalink / raw)
To: SCSI Mailing List
Sync up drivers/scsi/aic7xxx/. (2285-2294)
Signed-off-by: Luben Tuikov <luben_tuikov@adaptec.com>
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#175 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c ====
--- /tmp/tmp.26292.0 2004-09-27 12:52:08.017628688 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-08-27 12:45:31.000000000 -0400
@@ -1,7 +1,7 @@
/*
* Adaptec AIC79xx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#175 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#178 $
*
* --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -62,6 +62,16 @@
#include <linux/mm.h> /* For fetching system memory size */
+/************************* Magic SysReq Support *******************************/
+static struct aic_sysrq_key_op ahd_sysrq_op =
+{
+ aic_sysrq_handler,
+ "aic79xxstatedump",
+ "Dump aic79xx controller information to Console"
+};
+
+static int ahd_sysrq_key;
+
/*
* Lock protecting manipulation of the ahd softc list.
*/
@@ -871,7 +881,7 @@
siginitsetinv(¤t->blocked, 0);
daemonize();
- sprintf(current->comm, "ahd_dv_%d", ahd->unit);
+ sprintf(current->comm, "ahd_recovery_%d", ahd->unit);
#else
daemonize("ahd_recovery_%d", ahd->unit);
#endif
@@ -927,6 +937,10 @@
{
ahd->platform_data->recovery_pid =
kernel_thread(ahd_linux_recovery_thread, ahd, 0);
+
+ if (ahd->platform_data->recovery_pid < 0)
+ return (-ahd->platform_data->recovery_pid);
+
return (0);
}
@@ -1019,12 +1033,42 @@
ahd = scb->ahd_softc;
ahd_lock(ahd, &s);
- /*
- * Skip timeouts that fire just after
- * they have been cancelled.
- */
- if ((scb->platform_data->flags & AHD_TIMEOUT_ACTIVE) != 0) {
+ if (scb == NULL
+ || scb->flags == SCB_FLAG_NONE) {
+ int done_late;
+
+ /*
+ * Handle timeout/completion races.
+ * If the command is still sitting on
+ * our completion queue, just re-instate
+ * the timeout. If we've already completed
+ * the command, done_late will be set and
+ * we will need to additionally complete it
+ * again to the mid-layer.
+ *
+ * Since done_late is cleared by adding a
+ * timer, we must save off its value first.
+ */
+ done_late = cmd->done_late;
+ scsi_add_timer(cmd, 60*HZ, ahd_linux_midlayer_timeout);
+ if (done_late)
+ cmd->scsi_done(cmd);
+ } else if ((scb->platform_data->flags & AHD_TIMEOUT_ACTIVE)) {
+
+ /*
+ * Handle the case of timeouts that expire just
+ * as we delete timers during recovery by skipping
+ * SCBs that don't have timers active.
+ */
scb->platform_data->flags &= ~AHD_TIMEOUT_ACTIVE;
+
+ /*
+ * We must clear out the function pointer so that
+ * scsi_add_timer does not believe that a del_timer
+ * is required before setting up a new timer for
+ * this command.
+ */
+ scb->io_ctx->eh_timeout.function = NULL;
ahd_timeout(scb);
}
ahd_unlock(ahd, &s);
@@ -1034,6 +1078,10 @@
void
ahd_linux_midlayer_timeout(struct scsi_cmnd *cmd)
{
+ struct ahd_softc *ahd;
+
+ ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
+ printf("%s: ahd_midlayer_timeout\n", ahd_name(ahd));
}
/********************** Host Template Entry Points ****************************/
/*
@@ -2351,13 +2399,20 @@
ahd_linux_setup_user_rd_strm_settings(ahd);
ahd_linux_initialize_scsi_bus(ahd);
ahd_unlock(ahd, &s);
+ ahd_sysrq_key = aic_install_sysrq(&ahd_sysrq_op);
+ ahd_spawn_recovery_thread(ahd);
+ if (ahd->platform_data->recovery_pid < 0) {
+ printf("%s: Failed to create recovery thread, error= %d\n",
+ ahd_name(ahd), ahd->platform_data->recovery_pid);
+ return (-ahd->platform_data->recovery_pid);
+ }
ahd->platform_data->dv_pid = kernel_thread(ahd_linux_dv_thread, ahd, 0);
- ahd_lock(ahd, &s);
if (ahd->platform_data->dv_pid < 0) {
printf("%s: Failed to create DV thread, error= %d\n",
ahd_name(ahd), ahd->platform_data->dv_pid);
return (-ahd->platform_data->dv_pid);
}
+ ahd_lock(ahd, &s);
/*
* Initially allocate *all* of our linux target objects
* so that the DV thread will scan them all in parallel
@@ -2521,6 +2576,7 @@
struct ahd_linux_device *dev;
int i, j;
+ aic_remove_sysrq(ahd_sysrq_key, &ahd_sysrq_op);
if (ahd->platform_data != NULL) {
del_timer_sync(&ahd->platform_data->completeq_timer);
ahd_linux_kill_dv_thread(ahd);
@@ -5102,7 +5158,17 @@
new_status = DID_PARITY;
break;
case CAM_CMD_TIMEOUT:
- new_status = DID_TIME_OUT;
+ /*
+ * Returning DID_TIME_OUT will
+ * wake up the error recovery
+ * thread instead of doing the
+ * command retry we desire. Since
+ * we have already recovered the
+ * command, returning DID_ERROR
+ * will cause a retry up to the
+ * retry limit for this command.
+ */
+ new_status = DID_ERROR;
break;
case CAM_UA_ABORT:
case CAM_REQ_CMP_ERR:
@@ -5334,12 +5400,22 @@
void
ahd_platform_dump_card_state(struct ahd_softc *ahd)
{
+ struct Scsi_Host *host;
struct ahd_linux_device *dev;
int target;
int maxtarget;
int lun;
int i;
+ host = ahd->platform_data->host;
+ printf("%s: Host Status: %s%s%s%s%s\n",
+ ahd_name(ahd),
+ host->eh_active ? "eh_active " : "",
+ host->in_recovery ? "in_recovery " : "",
+ host->host_blocked ? "host_blocked " : "",
+ host->host_self_blocked ? "host_self_blocked " : "",
+ host->some_device_starved ? "some_device_starved" : "");
+
maxtarget = (ahd->features & AHD_WIDE) ? 15 : 7;
for (target = 0; target <=maxtarget; target++) {
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#140 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h ====
--- /tmp/tmp.26292.1 2004-09-27 12:52:08.190602392 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm.h 2003-08-28 16:40:09.000000000 -0400
@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#140 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#143 $
*
*/
#ifndef _AIC79XX_LINUX_H_
@@ -266,7 +266,7 @@
#define AHD_SCSI_HAS_HOST_LOCK 0
#endif
-#define AIC79XX_DRIVER_VERSION "2.0.0"
+#define AIC79XX_DRIVER_VERSION "2.0.1"
/**************************** Front End Queues ********************************/
/*
@@ -565,7 +565,7 @@
ahd = (struct ahd_softc *)arg;
del_timer(timer);
timer->data = (u_long)arg;
- timer->expires = jiffies + (usec * HZ)/1000000;
+ timer->expires = jiffies + (usec / AIC_USECS_PER_JIFFY);
timer->function = (ahd_linux_callback_t*)func;
add_timer(timer);
}
@@ -577,7 +577,7 @@
/*
* Convert from jiffies to usec.
*/
- return (scb->io_ctx->timeout_per_command * (1000000/HZ));
+ return (scb->io_ctx->timeout_per_command * AIC_USECS_PER_JIFFY);
}
static __inline void
@@ -591,8 +591,15 @@
static __inline void
ahd_scb_timer_reset(struct scb *scb, uint32_t usec)
{
+ /*
+ * Restore timer data that is clobbered by scsi_delete_timer().
+ */
+ scb->io_ctx->eh_timeout.data = (unsigned long)scb->io_ctx;
+ scb->io_ctx->eh_timeout.function =
+ (void (*)(unsigned long))ahd_platform_timeout;
scb->platform_data->flags |= AHD_TIMEOUT_ACTIVE;
- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
+ mod_timer(&scb->io_ctx->eh_timeout,
+ jiffies + (usec / AIC_USECS_PER_JIFFY));
}
/************************** Error Recovery ************************************/
@@ -849,74 +856,10 @@
}
/******************************* PCI Definitions ******************************/
-/*
- * PCIM_xxx: mask to locate subfield in register
- * PCIR_xxx: config register offset
- * PCIC_xxx: device class
- * PCIS_xxx: device subclass
- * PCIP_xxx: device programming interface
- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
- * PCID_xxx: device ID
- */
-#define PCIR_DEVVENDOR 0x00
-#define PCIR_VENDOR 0x00
-#define PCIR_DEVICE 0x02
-#define PCIR_COMMAND 0x04
-#define PCIM_CMD_PORTEN 0x0001
-#define PCIM_CMD_MEMEN 0x0002
-#define PCIM_CMD_BUSMASTEREN 0x0004
-#define PCIM_CMD_MWRICEN 0x0010
-#define PCIM_CMD_PERRESPEN 0x0040
-#define PCIM_CMD_SERRESPEN 0x0100
-#define PCIR_STATUS 0x06
-#define PCIR_REVID 0x08
-#define PCIR_PROGIF 0x09
-#define PCIR_SUBCLASS 0x0a
-#define PCIR_CLASS 0x0b
-#define PCIR_CACHELNSZ 0x0c
-#define PCIR_LATTIMER 0x0d
-#define PCIR_HEADERTYPE 0x0e
-#define PCIM_MFDEV 0x80
-#define PCIR_BIST 0x0f
-#define PCIR_CAP_PTR 0x34
-
-/* config registers for header type 0 devices */
-#define PCIR_MAPS 0x10
-#define PCIR_SUBVEND_0 0x2c
-#define PCIR_SUBDEV_0 0x2e
-
-/****************************** PCI-X definitions *****************************/
-#define PCIXR_COMMAND 0x96
-#define PCIXR_DEVADDR 0x98
-#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
-#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
-#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
-#define PCIXR_STATUS 0x9A
-#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
-#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
-#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
-#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
-#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
-#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
-#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
-#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
-#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
extern struct pci_driver aic79xx_pci_driver;
#endif
-typedef enum
-{
- AHD_POWER_STATE_D0,
- AHD_POWER_STATE_D1,
- AHD_POWER_STATE_D2,
- AHD_POWER_STATE_D3
-} ahd_power_state;
-
-void ahd_power_state_change(struct ahd_softc *ahd,
- ahd_power_state new_state);
-
/******************************* PCI Routines *********************************/
int ahd_linux_pci_init(void);
void ahd_linux_pci_exit(void);
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#25 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c ====
--- /tmp/tmp.26292.2 2004-09-27 12:52:08.259591904 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2003-08-14 15:03:47.000000000 -0400
@@ -36,12 +36,18 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#25 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#26 $
*/
#include "aic79xx_osm.h"
#include "aic79xx_inline.h"
+/*
+ * Include aiclib_pci.c as part of our
+ * "module dependencies are hard" work around.
+ */
+#include "aiclib_pci.c"
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
struct pci_device_id
{
@@ -404,42 +410,3 @@
return (-error);
}
-
-void
-ahd_power_state_change(struct ahd_softc *ahd, ahd_power_state new_state)
-{
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- pci_set_power_state(ahd->dev_softc, new_state);
-#else
- uint32_t cap;
- u_int cap_offset;
-
- /*
- * Traverse the capability list looking for
- * the power management capability.
- */
- cap = 0;
- cap_offset = ahd_pci_read_config(ahd->dev_softc,
- PCIR_CAP_PTR, /*bytes*/1);
- while (cap_offset != 0) {
-
- cap = ahd_pci_read_config(ahd->dev_softc,
- cap_offset, /*bytes*/4);
- if ((cap & 0xFF) == 1
- && ((cap >> 16) & 0x3) > 0) {
- uint32_t pm_control;
-
- pm_control = ahd_pci_read_config(ahd->dev_softc,
- cap_offset + 4,
- /*bytes*/4);
- pm_control &= ~0x3;
- pm_control |= new_state;
- ahd_pci_write_config(ahd->dev_softc,
- cap_offset + 4,
- pm_control, /*bytes*/2);
- break;
- }
- cap_offset = (cap >> 8) & 0xFF;
- }
-#endif
-}
==== //depot/aic7xxx/aic7xxx/aic79xx_pci.c#78 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_pci.c ====
--- /tmp/tmp.26292.3 2004-09-27 12:52:08.439564544 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic79xx_pci.c 2003-08-14 15:00:34.000000000 -0400
@@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#78 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#79 $
*
* $FreeBSD$
*/
@@ -340,7 +340,7 @@
}
ahd->bus_description = pci_bus_modes[PCI_BUS_MODES_INDEX(devconfig)];
- ahd_power_state_change(ahd, AHD_POWER_STATE_D0);
+ ahd_power_state_change(ahd, AIC_POWER_STATE_D0);
error = ahd_pci_map_registers(ahd);
if (error != 0)
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#238 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c ====
--- /tmp/tmp.26292.4 2004-09-27 12:52:09.226444920 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-08-27 12:45:41.000000000 -0400
@@ -1,7 +1,7 @@
/*
* Adaptec AIC7xxx device driver for Linux.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#238 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#241 $
*
* Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science.
@@ -141,6 +141,16 @@
#include <linux/mm.h> /* For fetching system memory size */
#include <linux/blk.h> /* For block_size() */
+/************************* Magic SysReq Support *******************************/
+static struct aic_sysrq_key_op ahc_sysrq_op =
+{
+ aic_sysrq_handler,
+ "aic7xxxstatedump",
+ "Dump aic7xxx controller information to Console"
+};
+
+static int ahc_sysrq_key;
+
/*
* Lock protecting manipulation of the ahc softc list.
*/
@@ -859,7 +869,7 @@
siginitsetinv(¤t->blocked, 0);
daemonize();
- sprintf(current->comm, "ahc_dv_%d", ahc->unit);
+ sprintf(current->comm, "ahc_recovery_%d", ahc->unit);
#else
daemonize("ahc_recovery_%d", ahc->unit);
#endif
@@ -914,6 +924,10 @@
{
ahc->platform_data->recovery_pid =
kernel_thread(ahc_linux_recovery_thread, ahc, 0);
+
+ if (ahc->platform_data->recovery_pid < 0)
+ return (-ahc->platform_data->recovery_pid);
+
return (0);
}
@@ -1006,12 +1020,42 @@
ahc = scb->ahc_softc;
ahc_lock(ahc, &s);
- /*
- * Skip timeouts that fire just after
- * they have been cancelled.
- */
- if ((scb->platform_data->flags & AHC_TIMEOUT_ACTIVE) != 0) {
+ if (scb == NULL
+ || scb->flags == SCB_FLAG_NONE) {
+ int done_late;
+
+ /*
+ * Handle timeout/completion races.
+ * If the command is still sitting on
+ * our completion queue, just re-instate
+ * the timeout. If we've already completed
+ * the command, done_late will be set and
+ * we will need to additionally complete it
+ * again to the mid-layer.
+ *
+ * Since done_late is cleared by adding a
+ * timer, we must save off its value first.
+ */
+ done_late = cmd->done_late;
+ scsi_add_timer(cmd, 60*HZ, ahc_linux_midlayer_timeout);
+ if (done_late)
+ cmd->scsi_done(cmd);
+ } else if ((scb->platform_data->flags & AHC_TIMEOUT_ACTIVE)) {
+
+ /*
+ * Handle the case of timeouts that expire just
+ * as we delete timers during recovery by skipping
+ * SCBs that don't have timers active.
+ */
scb->platform_data->flags &= ~AHC_TIMEOUT_ACTIVE;
+
+ /*
+ * We must clear out the function pointer so that
+ * scsi_add_timer does not believe that a del_timer
+ * is required before setting up a new timer for
+ * this command.
+ */
+ scb->io_ctx->eh_timeout.function = NULL;
ahc_timeout(scb);
}
ahc_unlock(ahc, &s);
@@ -1021,6 +1065,10 @@
void
ahc_linux_midlayer_timeout(struct scsi_cmnd *cmd)
{
+ struct ahc_softc *ahc;
+
+ ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
+ printf("%s: ahc_midlayer_timeout\n", ahc_name(ahc));
}
/************************ Linux Entry Points **********************************/
/*
@@ -1969,13 +2017,20 @@
#endif
ahc_linux_initialize_scsi_bus(ahc);
ahc_unlock(ahc, &s);
+ ahc_sysrq_key = aic_install_sysrq(&ahc_sysrq_op);
+ ahc_spawn_recovery_thread(ahc);
+ if (ahc->platform_data->recovery_pid < 0) {
+ printf("%s: Failed to create recovery thread, error= %d\n",
+ ahc_name(ahc), ahc->platform_data->recovery_pid);
+ return (-ahc->platform_data->recovery_pid);
+ }
ahc->platform_data->dv_pid = kernel_thread(ahc_linux_dv_thread, ahc, 0);
- ahc_lock(ahc, &s);
if (ahc->platform_data->dv_pid < 0) {
printf("%s: Failed to create DV thread, error= %d\n",
ahc_name(ahc), ahc->platform_data->dv_pid);
return (-ahc->platform_data->dv_pid);
}
+ ahc_lock(ahc, &s);
/*
* Initially allocate *all* of our linux target objects
* so that the DV thread will scan them all in parallel
@@ -2181,6 +2236,7 @@
struct ahc_linux_device *dev;
int i, j;
+ aic_remove_sysrq(ahc_sysrq_key, &ahc_sysrq_op);
if (ahc->platform_data != NULL) {
del_timer_sync(&ahc->platform_data->completeq_timer);
ahc_linux_kill_dv_thread(ahc);
@@ -4730,7 +4786,17 @@
new_status = DID_PARITY;
break;
case CAM_CMD_TIMEOUT:
- new_status = DID_TIME_OUT;
+ /*
+ * Returning DID_TIME_OUT will
+ * wake up the error recovery
+ * thread instead of doing the
+ * command retry we desire. Since
+ * we have already recovered the
+ * command, returning DID_ERROR
+ * will cause a retry up to the
+ * retry limit for this command.
+ */
+ new_status = DID_ERROR;
break;
case CAM_UA_ABORT:
case CAM_REQ_CMP_ERR:
@@ -5316,6 +5382,7 @@
void
ahc_platform_dump_card_state(struct ahc_softc *ahc)
{
+ struct Scsi_Host *host;
struct ahc_linux_device *dev;
int channel;
int maxchannel;
@@ -5324,6 +5391,15 @@
int lun;
int i;
+ host = ahc->platform_data->host;
+ printf("%s: Host Status: %s%s%s%s%s\n",
+ ahc_name(ahc),
+ host->eh_active ? "eh_active " : "",
+ host->in_recovery ? "in_recovery " : "",
+ host->host_blocked ? "host_blocked " : "",
+ host->host_self_blocked ? "host_self_blocked " : "",
+ host->some_device_starved ? "some_device_starved" : "");
+
maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
for (channel = 0; channel <= maxchannel; channel++) {
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#153 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h ====
--- /tmp/tmp.26292.5 2004-09-27 12:52:09.431413760 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm.h 2003-08-28 16:40:53.000000000 -0400
@@ -53,7 +53,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#153 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#155 $
*
*/
#ifndef _AIC7XXX_LINUX_H_
@@ -570,7 +570,7 @@
ahc = (struct ahc_softc *)arg;
del_timer(timer);
timer->data = (u_long)arg;
- timer->expires = jiffies + (usec * HZ)/1000000;
+ timer->expires = jiffies + (usec / AIC_USECS_PER_JIFFY);
timer->function = (ahc_linux_callback_t*)func;
add_timer(timer);
}
@@ -580,10 +580,9 @@
{
/*
- * Convert from jiffies to usec avoiding
- * overflow and truncation.
+ * Convert from jiffies to usec.
*/
- return (scb->io_ctx->timeout_per_command * (1000000/HZ));
+ return (scb->io_ctx->timeout_per_command * AIC_USECS_PER_JIFFY);
}
static __inline void
@@ -597,8 +596,15 @@
static __inline void
ahc_scb_timer_reset(struct scb *scb, uint32_t usec)
{
+ /*
+ * Restore timer data that is clobbered by scsi_delete_timer().
+ */
+ scb->io_ctx->eh_timeout.data = (unsigned long)scb->io_ctx;
+ scb->io_ctx->eh_timeout.function =
+ (void (*)(unsigned long))ahc_platform_timeout;
scb->platform_data->flags |= AHC_TIMEOUT_ACTIVE;
- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
+ mod_timer(&scb->io_ctx->eh_timeout,
+ jiffies + (usec / AIC_USECS_PER_JIFFY));
}
/************************** Error Recovery ************************************/
@@ -827,54 +833,10 @@
}
/******************************* PCI Definitions ******************************/
-/*
- * PCIM_xxx: mask to locate subfield in register
- * PCIR_xxx: config register offset
- * PCIC_xxx: device class
- * PCIS_xxx: device subclass
- * PCIP_xxx: device programming interface
- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
- * PCID_xxx: device ID
- */
-#define PCIR_DEVVENDOR 0x00
-#define PCIR_VENDOR 0x00
-#define PCIR_DEVICE 0x02
-#define PCIR_COMMAND 0x04
-#define PCIM_CMD_PORTEN 0x0001
-#define PCIM_CMD_MEMEN 0x0002
-#define PCIM_CMD_BUSMASTEREN 0x0004
-#define PCIM_CMD_MWRICEN 0x0010
-#define PCIM_CMD_PERRESPEN 0x0040
-#define PCIM_CMD_SERRESPEN 0x0100
-#define PCIR_STATUS 0x06
-#define PCIR_REVID 0x08
-#define PCIR_PROGIF 0x09
-#define PCIR_SUBCLASS 0x0a
-#define PCIR_CLASS 0x0b
-#define PCIR_CACHELNSZ 0x0c
-#define PCIR_LATTIMER 0x0d
-#define PCIR_HEADERTYPE 0x0e
-#define PCIM_MFDEV 0x80
-#define PCIR_BIST 0x0f
-#define PCIR_CAP_PTR 0x34
-
-/* config registers for header type 0 devices */
-#define PCIR_MAPS 0x10
-#define PCIR_SUBVEND_0 0x2c
-#define PCIR_SUBDEV_0 0x2e
-
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
extern struct pci_driver aic7xxx_pci_driver;
#endif
-typedef enum
-{
- AHC_POWER_STATE_D0,
- AHC_POWER_STATE_D1,
- AHC_POWER_STATE_D2,
- AHC_POWER_STATE_D3
-} ahc_power_state;
-
/**************************** VL/EISA Routines ********************************/
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \
&& (defined(__i386__) || defined(__alpha__)) \
@@ -893,8 +855,6 @@
/******************************* PCI Routines *********************************/
#ifdef CONFIG_PCI
-void ahc_power_state_change(struct ahc_softc *ahc,
- ahc_power_state new_state);
int ahc_linux_pci_init(void);
void ahc_linux_pci_exit(void);
int ahc_pci_map_registers(struct ahc_softc *ahc);
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#47 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c ====
--- /tmp/tmp.26292.6 2004-09-27 12:52:09.522399928 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2003-08-14 15:04:10.000000000 -0400
@@ -36,11 +36,17 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#47 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#48 $
*/
#include "aic7xxx_osm.h"
+/*
+ * Include aiclib_pci.c as part of our
+ * "module dependencies are hard" work around.
+ */
+#include "aiclib_pci.c"
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
struct pci_device_id
{
@@ -381,42 +387,3 @@
return (-error);
}
-
-void
-ahc_power_state_change(struct ahc_softc *ahc, ahc_power_state new_state)
-{
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- pci_set_power_state(ahc->dev_softc, new_state);
-#else
- uint32_t cap;
- u_int cap_offset;
-
- /*
- * Traverse the capability list looking for
- * the power management capability.
- */
- cap = 0;
- cap_offset = ahc_pci_read_config(ahc->dev_softc,
- PCIR_CAP_PTR, /*bytes*/1);
- while (cap_offset != 0) {
-
- cap = ahc_pci_read_config(ahc->dev_softc,
- cap_offset, /*bytes*/4);
- if ((cap & 0xFF) == 1
- && ((cap >> 16) & 0x3) > 0) {
- uint32_t pm_control;
-
- pm_control = ahc_pci_read_config(ahc->dev_softc,
- cap_offset + 4,
- /*bytes*/4);
- pm_control &= ~0x3;
- pm_control |= new_state;
- ahc_pci_write_config(ahc->dev_softc,
- cap_offset + 4,
- pm_control, /*bytes*/2);
- break;
- }
- cap_offset = (cap >> 8) & 0xFF;
- }
-#endif
-}
==== //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#70 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_pci.c ====
--- /tmp/tmp.26292.7 2004-09-27 12:52:09.965332592 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aic7xxx_pci.c 2003-08-15 12:37:51.000000000 -0400
@@ -39,7 +39,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#70 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#71 $
*
* $FreeBSD$
*/
@@ -798,7 +798,7 @@
ahc->chip |= AHC_PCI;
ahc->description = entry->name;
- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
+ ahc_power_state_change(ahc, AIC_POWER_STATE_D0);
error = ahc_pci_map_registers(ahc);
if (error != 0)
@@ -2095,7 +2095,7 @@
ahc_pci_resume(struct ahc_softc *ahc)
{
- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
+ ahc_power_state_change(ahc, AIC_POWER_STATE_D0);
/*
* We assume that the OS has restored our register
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.c#9 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c ====
--- /tmp/tmp.26292.8 2004-09-27 12:52:10.227292768 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.c 2003-08-27 12:49:21.000000000 -0400
@@ -1417,6 +1417,7 @@
aic_sysrq_handler(int key, struct pt_regs *unused, struct kbd_struct *unused1,
struct tty_struct *unused2)
{
+#ifdef CONFIG_MAGIC_SYSRQ
struct aic_softc *aic;
u_long l;
@@ -1430,11 +1431,13 @@
aic_unlock(aic, &s);
}
aic_list_unlock(&l);
+#endif
}
int
-aic_install_sysrq(struct sysrq_key_op *key_op)
+aic_install_sysrq(struct aic_sysrq_key_op *key_op)
{
+#ifdef CONFIG_MAGIC_SYSRQ
char *str;
int len;
int i;
@@ -1452,12 +1455,15 @@
return (key);
}
}
+#endif
return (0);
}
void
-aic_remove_sysrq(int key, struct sysrq_key_op *key_op)
+aic_remove_sysrq(int key, struct aic_sysrq_key_op *key_op)
{
+#ifdef CONFIG_MAGIC_SYSRQ
unregister_sysrq_key(key, key_op);
+#endif
}
==== //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aiclib.h#11 - /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h ====
--- /tmp/tmp.26292.9 2004-09-27 12:52:10.457257808 -0400
+++ /home/luben/projects/linux/2.6/linux-2.5/drivers/scsi/aic7xxx/aiclib.h 2003-08-28 16:37:39.000000000 -0400
@@ -1,4 +1,5 @@
/*
+ * SCSI definitions...
* Largely written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems.
*
@@ -867,6 +868,68 @@
extern const char *scsi_sense_key_text[];
+/******************************* PCI Definitions ******************************/
+/*
+ * PCIM_xxx: mask to locate subfield in register
+ * PCIR_xxx: config register offset
+ * PCIC_xxx: device class
+ * PCIS_xxx: device subclass
+ * PCIP_xxx: device programming interface
+ * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
+ * PCID_xxx: device ID
+ */
+#define PCIR_DEVVENDOR 0x00
+#define PCIR_VENDOR 0x00
+#define PCIR_DEVICE 0x02
+#define PCIR_COMMAND 0x04
+#define PCIM_CMD_PORTEN 0x0001
+#define PCIM_CMD_MEMEN 0x0002
+#define PCIM_CMD_BUSMASTEREN 0x0004
+#define PCIM_CMD_MWRICEN 0x0010
+#define PCIM_CMD_PERRESPEN 0x0040
+#define PCIM_CMD_SERRESPEN 0x0100
+#define PCIR_STATUS 0x06
+#define PCIR_REVID 0x08
+#define PCIR_PROGIF 0x09
+#define PCIR_SUBCLASS 0x0a
+#define PCIR_CLASS 0x0b
+#define PCIR_CACHELNSZ 0x0c
+#define PCIR_LATTIMER 0x0d
+#define PCIR_HEADERTYPE 0x0e
+#define PCIM_MFDEV 0x80
+#define PCIR_BIST 0x0f
+#define PCIR_CAP_PTR 0x34
+
+/* config registers for header type 0 devices */
+#define PCIR_MAPS 0x10
+#define PCIR_SUBVEND_0 0x2c
+#define PCIR_SUBDEV_0 0x2e
+
+typedef enum
+{
+ AIC_POWER_STATE_D0,
+ AIC_POWER_STATE_D1,
+ AIC_POWER_STATE_D2,
+ AIC_POWER_STATE_D3
+} aic_power_state;
+
+/****************************** PCI-X definitions *****************************/
+#define PCIXR_COMMAND 0x96
+#define PCIXR_DEVADDR 0x98
+#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
+#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
+#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
+#define PCIXR_STATUS 0x9A
+#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
+#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
+#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
+#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
+#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
+#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
+#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
+#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
+#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
+
/************************* Large Disk Handling ********************************/
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
static __inline int aic_sector_div(u_long capacity, int heads, int sectors);
@@ -913,6 +976,7 @@
#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
+#define aic_power_state_change AIC_LIB_ENTRY(_power_state_change)
#define aic_sysrq_handler AIC_LIB_ENTRY(_sysrq_handler)
#define aic_install_sysrq AIC_LIB_ENTRY(_install_sysrq)
#define aic_remove_sysrq AIC_LIB_ENTRY(_remove_sysrq)
@@ -929,12 +993,22 @@
/************************* Magic SysReq Support *******************************/
#include <linux/sysrq.h>
+#ifdef CONFIG_MAGIC_SYSRQ
+#define aic_sysrq_key_op sysrq_key_op
+#else
+struct aic_sysrq_key_op {
+ void (*handler)(int, struct pt_regs *, struct kbd_struct *,
+ struct tty_struct *);
+ char *help_msg;
+ char *action_msg;
+};
+#endif
void aic_sysrq_handler(int, struct pt_regs *,
struct kbd_struct *,
struct tty_struct *);
-int aic_install_sysrq(struct sysrq_key_op *);
+int aic_install_sysrq(struct aic_sysrq_key_op *);
void aic_remove_sysrq(int key,
- struct sysrq_key_op *key_op);
+ struct aic_sysrq_key_op *key_op);
/************************ SCSI Library Functions *****************************/
void aic_sense_desc(int /*sense_key*/, int /*asc*/,
@@ -1066,4 +1140,10 @@
return (rv);
}
+/*************************** Forward Declarations *****************************/
+struct aic_softc;
+
+/******************************* PCI Funcitons ******************************/
+void aic_power_state_change(struct aic_softc *aic, aic_power_state new_state);
+
#endif /*_AICLIB_H */
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-09-28 13:05 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-09-28 13:04 [patch 6/28] Sync up drivers/scsi/aic7xxx Luben Tuikov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).