Commit f73b780d authored by Justin T. Gibbs's avatar Justin T. Gibbs

Aic79xx Driver Update (version 1.3.8)

 o Correct a few BE processor bugs
 o Print an additional diagnostic during recovery processing
parent 81ebcc6d
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#189 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#190 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -1052,7 +1052,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ...@@ -1052,7 +1052,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
switch (scb->hscb->task_management) { switch (scb->hscb->task_management) {
case SIU_TASKMGMT_ABORT_TASK: case SIU_TASKMGMT_ABORT_TASK:
tag = scb->hscb->tag; tag = SCB_GET_TAG(scb);
case SIU_TASKMGMT_ABORT_TASK_SET: case SIU_TASKMGMT_ABORT_TASK_SET:
case SIU_TASKMGMT_CLEAR_TASK_SET: case SIU_TASKMGMT_CLEAR_TASK_SET:
lun = scb->hscb->lun; lun = scb->hscb->lun;
...@@ -1116,7 +1116,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ...@@ -1116,7 +1116,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
ahd_outb(ahd, SCB_TASK_MANAGEMENT, 0); ahd_outb(ahd, SCB_TASK_MANAGEMENT, 0);
ahd_search_qinfifo(ahd, SCB_GET_TARGET(ahd, scb), ahd_search_qinfifo(ahd, SCB_GET_TARGET(ahd, scb),
SCB_GET_CHANNEL(ahd, scb), SCB_GET_CHANNEL(ahd, scb),
SCB_GET_LUN(scb), scb->hscb->tag, SCB_GET_LUN(scb), SCB_GET_TAG(scb),
ROLE_INITIATOR, /*status*/0, ROLE_INITIATOR, /*status*/0,
SEARCH_REMOVE); SEARCH_REMOVE);
} }
...@@ -5517,7 +5517,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb) ...@@ -5517,7 +5517,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb)
/* Clean up for the next user */ /* Clean up for the next user */
scb->flags = SCB_FLAG_NONE; scb->flags = SCB_FLAG_NONE;
scb->hscb->control = 0; scb->hscb->control = 0;
ahd->scb_data.scbindex[scb->hscb->tag] = NULL; ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = NULL;
if (scb->col_scb == NULL) { if (scb->col_scb == NULL) {
...@@ -5930,7 +5930,7 @@ ahd_init(struct ahd_softc *ahd) ...@@ -5930,7 +5930,7 @@ ahd_init(struct ahd_softc *ahd)
* specially from the DMA safe memory chunk used for the QOUTFIFO. * specially from the DMA safe memory chunk used for the QOUTFIFO.
*/ */
ahd->next_queued_hscb = (struct hardware_scb *)next_vaddr; ahd->next_queued_hscb = (struct hardware_scb *)next_vaddr;
ahd->next_queued_hscb->hscb_busaddr = next_baddr; ahd->next_queued_hscb->hscb_busaddr = ahd_htole32(next_baddr);
ahd->init_level++; ahd->init_level++;
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#46 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#48 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -298,9 +298,12 @@ ahd_setup_data_scb(struct ahd_softc *ahd, struct scb *scb) ...@@ -298,9 +298,12 @@ ahd_setup_data_scb(struct ahd_softc *ahd, struct scb *scb)
scb->hscb->datacnt = sg->len; scb->hscb->datacnt = sg->len;
} else { } else {
struct ahd_dma_seg *sg; struct ahd_dma_seg *sg;
uint32_t *dataptr_words;
sg = (struct ahd_dma_seg *)scb->sg_list; sg = (struct ahd_dma_seg *)scb->sg_list;
scb->hscb->dataptr = sg->addr; dataptr_words = (uint32_t*)&scb->hscb->dataptr;
dataptr_words[0] = sg->addr;
dataptr_words[1] = 0;
if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) { if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
uint64_t high_addr; uint64_t high_addr;
...@@ -777,12 +780,15 @@ ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb) ...@@ -777,12 +780,15 @@ ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb)
#ifdef AHD_DEBUG #ifdef AHD_DEBUG
if ((ahd_debug & AHD_SHOW_QUEUE) != 0) { if ((ahd_debug & AHD_SHOW_QUEUE) != 0) {
uint64_t host_dataptr;
host_dataptr = ahd_le64toh(scb->hscb->dataptr);
printf("%s: Queueing SCB 0x%x bus addr 0x%x - 0x%x%x/0x%x\n", printf("%s: Queueing SCB 0x%x bus addr 0x%x - 0x%x%x/0x%x\n",
ahd_name(ahd), ahd_name(ahd),
SCB_GET_TAG(scb), scb->hscb->hscb_busaddr, SCB_GET_TAG(scb), ahd_le32toh(scb->hscb->hscb_busaddr),
(u_int)((scb->hscb->dataptr >> 32) & 0xFFFFFFFF), (u_int)((host_dataptr >> 32) & 0xFFFFFFFF),
(u_int)(scb->hscb->dataptr & 0xFFFFFFFF), (u_int)(host_dataptr & 0xFFFFFFFF),
scb->hscb->datacnt); ahd_le32toh(scb->hscb->datacnt));
} }
#endif #endif
/* Tell the adapter about the newly queued SCB */ /* Tell the adapter about the newly queued SCB */
...@@ -891,6 +897,9 @@ ahd_intr(struct ahd_softc *ahd) ...@@ -891,6 +897,9 @@ ahd_intr(struct ahd_softc *ahd)
else else
intstat = ahd_inb(ahd, INTSTAT); intstat = ahd_inb(ahd, INTSTAT);
if ((intstat & INT_PEND) == 0)
return (0);
if (intstat & CMDCMPLT) { if (intstat & CMDCMPLT) {
ahd_outb(ahd, CLRINT, CLRCMDINT); ahd_outb(ahd, CLRINT, CLRCMDINT);
...@@ -924,9 +933,6 @@ ahd_intr(struct ahd_softc *ahd) ...@@ -924,9 +933,6 @@ ahd_intr(struct ahd_softc *ahd)
#endif #endif
} }
if ((intstat & INT_PEND) == 0)
return (0);
/* /*
* Handle statuses that may invalidate our cached * Handle statuses that may invalidate our cached
* copy of INTSTAT separately. * copy of INTSTAT separately.
......
/* /*
* Adaptec AIC79xx device driver for Linux. * Adaptec AIC79xx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#157 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#159 $
* *
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs. * Copyright (c) 1994-2000 Justin T. Gibbs.
...@@ -1292,6 +1292,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd) ...@@ -1292,6 +1292,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
u_int last_phase; u_int last_phase;
u_int cdb_byte; u_int cdb_byte;
int retval; int retval;
int was_paused;
int paused; int paused;
int wait; int wait;
int disconnected; int disconnected;
...@@ -1394,6 +1395,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd) ...@@ -1394,6 +1395,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
* didn't "just" miss an interrupt that would * didn't "just" miss an interrupt that would
* affect this cmd. * affect this cmd.
*/ */
was_paused = ahd_is_paused(ahd);
ahd_pause_and_flushwork(ahd); ahd_pause_and_flushwork(ahd);
paused = TRUE; paused = TRUE;
...@@ -1404,11 +1406,13 @@ ahd_linux_abort(Scsi_Cmnd *cmd) ...@@ -1404,11 +1406,13 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
goto no_cmd; goto no_cmd;
} }
printf("%s: At time of recovery, card was %spaused\n",
was_paused ? "" : "not ");
ahd_dump_card_state(ahd); ahd_dump_card_state(ahd);
disconnected = TRUE; disconnected = TRUE;
if (ahd_search_qinfifo(ahd, cmd->device->id, cmd->device->channel + 'A', if (ahd_search_qinfifo(ahd, cmd->device->id, cmd->device->channel + 'A',
cmd->device->lun, pending_scb->hscb->tag, cmd->device->lun, SCB_GET_TAG(pending_scb),
ROLE_INITIATOR, CAM_REQ_ABORTED, ROLE_INITIATOR, CAM_REQ_ABORTED,
SEARCH_COMPLETE) > 0) { SEARCH_COMPLETE) > 0) {
printf("%s:%d:%d:%d: Cmd aborted from QINFIFO\n", printf("%s:%d:%d:%d: Cmd aborted from QINFIFO\n",
...@@ -1437,7 +1441,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd) ...@@ -1437,7 +1441,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
* bus or is in the disconnected state. * bus or is in the disconnected state.
*/ */
if (last_phase != P_BUSFREE if (last_phase != P_BUSFREE
&& pending_scb->hscb->tag == active_scbptr) { && SCB_GET_TAG(pending_scb) == active_scbptr) {
/* /*
* We're active on the bus, so assert ATN * We're active on the bus, so assert ATN
...@@ -1458,7 +1462,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd) ...@@ -1458,7 +1462,7 @@ ahd_linux_abort(Scsi_Cmnd *cmd)
* to select the device before it reconnects. * to select the device before it reconnects.
*/ */
pending_scb->flags |= SCB_RECOVERY_SCB|SCB_ABORT; pending_scb->flags |= SCB_RECOVERY_SCB|SCB_ABORT;
ahd_set_scbptr(ahd, pending_scb->hscb->tag); ahd_set_scbptr(ahd, SCB_GET_TAG(pending_scb));
pending_scb->hscb->cdb_len = 0; pending_scb->hscb->cdb_len = 0;
pending_scb->hscb->task_attribute = 0; pending_scb->hscb->task_attribute = 0;
pending_scb->hscb->task_management = SIU_TASKMGMT_ABORT_TASK; pending_scb->hscb->task_management = SIU_TASKMGMT_ABORT_TASK;
...@@ -4448,13 +4452,12 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb) ...@@ -4448,13 +4452,12 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb)
Scsi_Cmnd *cmd; Scsi_Cmnd *cmd;
struct ahd_linux_device *dev; struct ahd_linux_device *dev;
LIST_REMOVE(scb, pending_links);
if ((scb->flags & SCB_ACTIVE) == 0) { if ((scb->flags & SCB_ACTIVE) == 0) {
printf("SCB %d done'd twice\n", scb->hscb->tag); printf("SCB %d done'd twice\n", SCB_GET_TAG(scb));
ahd_dump_card_state(ahd); ahd_dump_card_state(ahd);
panic("Stopping for safety"); panic("Stopping for safety");
} }
LIST_REMOVE(scb, pending_links);
cmd = scb->io_ctx; cmd = scb->io_ctx;
dev = scb->platform_data->dev; dev = scb->platform_data->dev;
dev->active--; dev->active--;
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#129 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#130 $
* *
*/ */
#ifndef _AIC79XX_LINUX_H_ #ifndef _AIC79XX_LINUX_H_
...@@ -293,7 +293,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec) ...@@ -293,7 +293,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec)
#define AHD_SCSI_HAS_HOST_LOCK 0 #define AHD_SCSI_HAS_HOST_LOCK 0
#endif #endif
#define AIC79XX_DRIVER_VERSION "1.3.7" #define AIC79XX_DRIVER_VERSION "1.3.8"
/**************************** Front End Queues ********************************/ /**************************** Front End Queues ********************************/
/* /*
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES. * POSSIBILITY OF SUCH DAMAGES.
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#70 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#71 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -565,14 +565,13 @@ ahd_check_extport(struct ahd_softc *ahd) ...@@ -565,14 +565,13 @@ ahd_check_extport(struct ahd_softc *ahd)
#if AHD_DEBUG #if AHD_DEBUG
if (have_seeprom != 0 if (have_seeprom != 0
&& (ahd_debug & AHD_DUMP_SEEPROM) != 0) { && (ahd_debug & AHD_DUMP_SEEPROM) != 0) {
uint8_t *sc_data; uint16_t *sc_data;
int i; int i;
printf("%s: Seeprom Contents:", ahd_name(ahd)); printf("%s: Seeprom Contents:", ahd_name(ahd));
sc_data = (uint8_t *)sc; sc_data = (uint16_t *)sc;
for (i = 0; i < (sizeof(*sc)); i += 2) for (i = 0; i < (sizeof(*sc)); i += 2)
printf("\n\t0x%.4x", printf("\n\t0x%.4x", sc_data[i]);
sc_data[i] | (sc_data[i+1] << 8));
printf("\n"); printf("\n");
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment