Commit 4548e111 authored by Justin T. Gibbs's avatar Justin T. Gibbs

Merge http://linux.bkbits.net/linux-2.5

into overdrive.btc.adaptec.com:/usr/home/gibbs/bk/linux-2.5
parents ace40f57 06d7b0f9
...@@ -132,6 +132,11 @@ The following information is available in this file: ...@@ -132,6 +132,11 @@ The following information is available in this file:
2. Version History 2. Version History
6.2.34 - Fix locking regression instroduced in 6.2.29 that
could cuase a lock order reversal between the io_request_lock
and our per-softc lock. This was only possible on RH9,
SuSE, and kernel.org 2.4.X kernels.
6.2.33 - Dynamically disable PCI parity error reporting after 6.2.33 - Dynamically disable PCI parity error reporting after
10 errors are reported to the user. These errors are 10 errors are reported to the user. These errors are
the result of some other device issuing PCI transactions the result of some other device issuing PCI transactions
......
...@@ -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.h#89 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#90 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -1225,20 +1225,20 @@ struct ahd_softc { ...@@ -1225,20 +1225,20 @@ struct ahd_softc {
int seltime; int seltime;
/* /*
* Interrupt coalessing settings. * Interrupt coalescing settings.
*/ */
#define AHD_INT_COALESSING_TIMER_DEFAULT 250 /*us*/ #define AHD_INT_COALESCING_TIMER_DEFAULT 250 /*us*/
#define AHD_INT_COALESSING_MAXCMDS_DEFAULT 10 #define AHD_INT_COALESCING_MAXCMDS_DEFAULT 10
#define AHD_INT_COALESSING_MAXCMDS_MAX 127 #define AHD_INT_COALESCING_MAXCMDS_MAX 127
#define AHD_INT_COALESSING_MINCMDS_DEFAULT 5 #define AHD_INT_COALESCING_MINCMDS_DEFAULT 5
#define AHD_INT_COALESSING_MINCMDS_MAX 127 #define AHD_INT_COALESCING_MINCMDS_MAX 127
#define AHD_INT_COALESSING_THRESHOLD_DEFAULT 2000 #define AHD_INT_COALESCING_THRESHOLD_DEFAULT 2000
#define AHD_INT_COALESSING_STOP_THRESHOLD_DEFAULT 1000 #define AHD_INT_COALESCING_STOP_THRESHOLD_DEFAULT 1000
u_int int_coalessing_timer; u_int int_coalescing_timer;
u_int int_coalessing_maxcmds; u_int int_coalescing_maxcmds;
u_int int_coalessing_mincmds; u_int int_coalescing_mincmds;
u_int int_coalessing_threshold; u_int int_coalescing_threshold;
u_int int_coalessing_stop_threshold; u_int int_coalescing_stop_threshold;
uint16_t user_discenable;/* Disconnection allowed */ uint16_t user_discenable;/* Disconnection allowed */
uint16_t user_tagenable;/* Tagged Queuing allowed */ uint16_t user_tagenable;/* Tagged Queuing allowed */
...@@ -1362,11 +1362,11 @@ int ahd_parse_vpddata(struct ahd_softc *ahd, ...@@ -1362,11 +1362,11 @@ int ahd_parse_vpddata(struct ahd_softc *ahd,
int ahd_parse_cfgdata(struct ahd_softc *ahd, int ahd_parse_cfgdata(struct ahd_softc *ahd,
struct seeprom_config *sc); struct seeprom_config *sc);
void ahd_intr_enable(struct ahd_softc *ahd, int enable); void ahd_intr_enable(struct ahd_softc *ahd, int enable);
void ahd_update_coalessing_values(struct ahd_softc *ahd, void ahd_update_coalescing_values(struct ahd_softc *ahd,
u_int timer, u_int timer,
u_int maxcmds, u_int maxcmds,
u_int mincmds); u_int mincmds);
void ahd_enable_coalessing(struct ahd_softc *ahd, void ahd_enable_coalescing(struct ahd_softc *ahd,
int enable); int enable);
void ahd_pause_and_flushwork(struct ahd_softc *ahd); void ahd_pause_and_flushwork(struct ahd_softc *ahd);
int ahd_suspend(struct ahd_softc *ahd); int ahd_suspend(struct ahd_softc *ahd);
...@@ -1514,7 +1514,7 @@ extern uint32_t ahd_debug; ...@@ -1514,7 +1514,7 @@ extern uint32_t ahd_debug;
#define AHD_SHOW_QUEUE 0x02000 #define AHD_SHOW_QUEUE 0x02000
#define AHD_SHOW_TQIN 0x04000 #define AHD_SHOW_TQIN 0x04000
#define AHD_SHOW_SG 0x08000 #define AHD_SHOW_SG 0x08000
#define AHD_SHOW_INT_COALESSING 0x10000 #define AHD_SHOW_INT_COALESCING 0x10000
#define AHD_DEBUG_SEQUENCER 0x20000 #define AHD_DEBUG_SEQUENCER 0x20000
#endif #endif
void ahd_print_scb(struct scb *scb); void ahd_print_scb(struct scb *scb);
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
* *
* $FreeBSD$ * $FreeBSD$
*/ */
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $" VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#68 $"
/* /*
* This file is processed by the aic7xxx_asm utility for use in assembling * This file is processed by the aic7xxx_asm utility for use in assembling
...@@ -286,7 +286,7 @@ register HS_MAILBOX { ...@@ -286,7 +286,7 @@ register HS_MAILBOX {
address 0x00B address 0x00B
access_mode RW access_mode RW
mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */ mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
mask ENINT_COALESS 0x40 /* Perform interrupt coalessing */ mask ENINT_COALESCE 0x40 /* Perform interrupt coalescing */
} }
/* /*
...@@ -3704,28 +3704,28 @@ scratch_ram { ...@@ -3704,28 +3704,28 @@ scratch_ram {
} }
/* /*
* The maximum amount of time to wait, when interrupt coalessing * The maximum amount of time to wait, when interrupt coalescing
* is enabled, before issueing a CMDCMPLT interrupt for a completed * is enabled, before issueing a CMDCMPLT interrupt for a completed
* command. * command.
*/ */
INT_COALESSING_TIMER { INT_COALESCING_TIMER {
size 2 size 2
} }
/* /*
* The maximum number of commands to coaless into a single interrupt. * The maximum number of commands to coalesce into a single interrupt.
* Actually the 2's complement of that value to simplify sequencer * Actually the 2's complement of that value to simplify sequencer
* code. * code.
*/ */
INT_COALESSING_MAXCMDS { INT_COALESCING_MAXCMDS {
size 1 size 1
} }
/* /*
* The minimum number of commands still outstanding required * The minimum number of commands still outstanding required
* to continue coalessing (2's complement of value). * to continue coalescing (2's complement of value).
*/ */
INT_COALESSING_MINCMDS { INT_COALESCING_MINCMDS {
size 1 size 1
} }
...@@ -3737,9 +3737,9 @@ scratch_ram { ...@@ -3737,9 +3737,9 @@ scratch_ram {
} }
/* /*
* The count of commands that have been coalessed. * The count of commands that have been coalesced.
*/ */
INT_COALESSING_CMDCOUNT { INT_COALESCING_CMDCOUNT {
size 1 size 1
} }
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
* $FreeBSD$ * $FreeBSD$
*/ */
VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $" VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#93 $"
PATCH_ARG_LIST = "struct ahd_softc *ahd" PATCH_ARG_LIST = "struct ahd_softc *ahd"
PREFIX = "ahd_" PREFIX = "ahd_"
...@@ -212,44 +212,44 @@ fill_qoutfifo_dmadone: ...@@ -212,44 +212,44 @@ fill_qoutfifo_dmadone:
qoutfifo_updated: qoutfifo_updated:
/* /*
* If there are more commands waiting to be dma'ed * If there are more commands waiting to be dma'ed
* to the host, always coaless. Otherwise honor the * to the host, always coalesce. Otherwise honor the
* host's wishes. * host's wishes.
*/ */
cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne coaless_by_count; cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne coalesce_by_count;
cmp COMPLETE_SCB_HEAD[1], SCB_LIST_NULL jne coaless_by_count; cmp COMPLETE_SCB_HEAD[1], SCB_LIST_NULL jne coalesce_by_count;
test LOCAL_HS_MAILBOX, ENINT_COALESS jz issue_cmdcmplt; test LOCAL_HS_MAILBOX, ENINT_COALESCE jz issue_cmdcmplt;
/* /*
* If we have relatively few commands outstanding, don't * If we have relatively few commands outstanding, don't
* bother waiting for another command to complete. * bother waiting for another command to complete.
*/ */
test CMDS_PENDING[1], 0xFF jnz coaless_by_count; test CMDS_PENDING[1], 0xFF jnz coalesce_by_count;
/* Add -1 so that jnc means <= not just < */ /* Add -1 so that jnc means <= not just < */
add A, -1, INT_COALESSING_MINCMDS; add A, -1, INT_COALESCING_MINCMDS;
add NONE, A, CMDS_PENDING; add NONE, A, CMDS_PENDING;
jnc issue_cmdcmplt; jnc issue_cmdcmplt;
/* /*
* If coalessing, only coaless up to the limit * If coalescing, only coalesce up to the limit
* provided by the host driver. * provided by the host driver.
*/ */
coaless_by_count: coalesce_by_count:
mov A, INT_COALESSING_MAXCMDS; mov A, INT_COALESCING_MAXCMDS;
add NONE, A, INT_COALESSING_CMDCOUNT; add NONE, A, INT_COALESCING_CMDCOUNT;
jc issue_cmdcmplt; jc issue_cmdcmplt;
/* /*
* If the timer is not currently active, * If the timer is not currently active,
* fire it up. * fire it up.
*/ */
test INTCTL, SWTMINTMASK jz return; test INTCTL, SWTMINTMASK jz return;
bmov SWTIMER, INT_COALESSING_TIMER, 2; bmov SWTIMER, INT_COALESCING_TIMER, 2;
mvi CLRSEQINTSTAT, CLRSEQ_SWTMRTO; mvi CLRSEQINTSTAT, CLRSEQ_SWTMRTO;
or INTCTL, SWTMINTEN|SWTIMER_START; or INTCTL, SWTMINTEN|SWTIMER_START;
and INTCTL, ~SWTMINTMASK ret; and INTCTL, ~SWTMINTMASK ret;
issue_cmdcmplt: issue_cmdcmplt:
mvi INTSTAT, CMDCMPLT; mvi INTSTAT, CMDCMPLT;
clr INT_COALESSING_CMDCOUNT; clr INT_COALESCING_CMDCOUNT;
or INTCTL, SWTMINTMASK ret; or INTCTL, SWTMINTMASK ret;
BEGIN_CRITICAL; BEGIN_CRITICAL;
...@@ -261,6 +261,15 @@ fetch_new_scb_done: ...@@ -261,6 +261,15 @@ fetch_new_scb_done:
clr A; clr A;
add CMDS_PENDING, 1; add CMDS_PENDING, 1;
adc CMDS_PENDING[1], A; adc CMDS_PENDING[1], A;
if ((ahd->bugs & AHD_PKT_LUN_BUG) != 0) {
/*
* "Short Luns" are not placed into outgoing LQ
* packets in the correct byte order. Use a full
* sized lun field instead and fill it with the
* one byte of lun information we support.
*/
mov SCB_PKT_LUN[6], SCB_LUN;
}
/* /*
* The FIFO use count field is shared with the * The FIFO use count field is shared with the
* tag set by the host so that our SCB dma engine * tag set by the host so that our SCB dma engine
...@@ -324,7 +333,7 @@ fill_qoutfifo_loop: ...@@ -324,7 +333,7 @@ fill_qoutfifo_loop:
mov CCSCBRAM, SCBPTR; mov CCSCBRAM, SCBPTR;
or CCSCBRAM, A, SCBPTR[1]; or CCSCBRAM, A, SCBPTR[1];
mov NONE, SDSCB_QOFF; mov NONE, SDSCB_QOFF;
inc INT_COALESSING_CMDCOUNT; inc INT_COALESCING_CMDCOUNT;
add CMDS_PENDING, -1; add CMDS_PENDING, -1;
adc CMDS_PENDING[1], -1; adc CMDS_PENDING[1], -1;
cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done; cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done;
......
...@@ -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#190 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#192 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -4806,12 +4806,12 @@ ahd_alloc(void *platform_arg, char *name) ...@@ -4806,12 +4806,12 @@ ahd_alloc(void *platform_arg, char *name)
| AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A; | AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A;
ahd_timer_init(&ahd->reset_timer); ahd_timer_init(&ahd->reset_timer);
ahd_timer_init(&ahd->stat_timer); ahd_timer_init(&ahd->stat_timer);
ahd->int_coalessing_timer = AHD_INT_COALESSING_TIMER_DEFAULT; ahd->int_coalescing_timer = AHD_INT_COALESCING_TIMER_DEFAULT;
ahd->int_coalessing_maxcmds = AHD_INT_COALESSING_MAXCMDS_DEFAULT; ahd->int_coalescing_maxcmds = AHD_INT_COALESCING_MAXCMDS_DEFAULT;
ahd->int_coalessing_mincmds = AHD_INT_COALESSING_MINCMDS_DEFAULT; ahd->int_coalescing_mincmds = AHD_INT_COALESCING_MINCMDS_DEFAULT;
ahd->int_coalessing_threshold = AHD_INT_COALESSING_THRESHOLD_DEFAULT; ahd->int_coalescing_threshold = AHD_INT_COALESCING_THRESHOLD_DEFAULT;
ahd->int_coalessing_stop_threshold = ahd->int_coalescing_stop_threshold =
AHD_INT_COALESSING_STOP_THRESHOLD_DEFAULT; AHD_INT_COALESCING_STOP_THRESHOLD_DEFAULT;
if (ahd_platform_alloc(ahd, platform_arg) != 0) { if (ahd_platform_alloc(ahd, platform_arg) != 0) {
ahd_free(ahd); ahd_free(ahd);
...@@ -5722,6 +5722,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd) ...@@ -5722,6 +5722,7 @@ ahd_alloc_scbs(struct ahd_softc *ahd)
next_scb->sg_list = segs; next_scb->sg_list = segs;
next_scb->sense_data = sense_data; next_scb->sense_data = sense_data;
next_scb->sense_busaddr = sense_busaddr; next_scb->sense_busaddr = sense_busaddr;
memset(hscb, 0, sizeof(*hscb));
next_scb->hscb = hscb; next_scb->hscb = hscb;
hscb->hscb_busaddr = ahd_htole32(hscb_busaddr); hscb->hscb_busaddr = ahd_htole32(hscb_busaddr);
...@@ -6341,14 +6342,14 @@ ahd_chip_init(struct ahd_softc *ahd) ...@@ -6341,14 +6342,14 @@ ahd_chip_init(struct ahd_softc *ahd)
ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF); ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
/* /*
* Default to coalessing disabled. * Default to coalescing disabled.
*/ */
ahd_outw(ahd, INT_COALESSING_CMDCOUNT, 0); ahd_outw(ahd, INT_COALESCING_CMDCOUNT, 0);
ahd_outw(ahd, CMDS_PENDING, 0); ahd_outw(ahd, CMDS_PENDING, 0);
ahd_update_coalessing_values(ahd, ahd->int_coalessing_timer, ahd_update_coalescing_values(ahd, ahd->int_coalescing_timer,
ahd->int_coalessing_maxcmds, ahd->int_coalescing_maxcmds,
ahd->int_coalessing_mincmds); ahd->int_coalescing_mincmds);
ahd_enable_coalessing(ahd, FALSE); ahd_enable_coalescing(ahd, FALSE);
ahd_loadseq(ahd); ahd_loadseq(ahd);
ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
...@@ -6601,30 +6602,30 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable) ...@@ -6601,30 +6602,30 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable)
} }
void void
ahd_update_coalessing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds,
u_int mincmds) u_int mincmds)
{ {
if (timer > AHD_TIMER_MAX_US) if (timer > AHD_TIMER_MAX_US)
timer = AHD_TIMER_MAX_US; timer = AHD_TIMER_MAX_US;
ahd->int_coalessing_timer = timer; ahd->int_coalescing_timer = timer;
if (maxcmds > AHD_INT_COALESSING_MAXCMDS_MAX) if (maxcmds > AHD_INT_COALESCING_MAXCMDS_MAX)
maxcmds = AHD_INT_COALESSING_MAXCMDS_MAX; maxcmds = AHD_INT_COALESCING_MAXCMDS_MAX;
if (mincmds > AHD_INT_COALESSING_MINCMDS_MAX) if (mincmds > AHD_INT_COALESCING_MINCMDS_MAX)
mincmds = AHD_INT_COALESSING_MINCMDS_MAX; mincmds = AHD_INT_COALESCING_MINCMDS_MAX;
ahd->int_coalessing_maxcmds = maxcmds; ahd->int_coalescing_maxcmds = maxcmds;
ahd_outw(ahd, INT_COALESSING_TIMER, timer / AHD_TIMER_US_PER_TICK); ahd_outw(ahd, INT_COALESCING_TIMER, timer / AHD_TIMER_US_PER_TICK);
ahd_outb(ahd, INT_COALESSING_MAXCMDS, -maxcmds); ahd_outb(ahd, INT_COALESCING_MAXCMDS, -maxcmds);
ahd_outb(ahd, INT_COALESSING_MINCMDS, -mincmds); ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds);
} }
void void
ahd_enable_coalessing(struct ahd_softc *ahd, int enable) ahd_enable_coalescing(struct ahd_softc *ahd, int enable)
{ {
ahd->hs_mailbox &= ~ENINT_COALESS; ahd->hs_mailbox &= ~ENINT_COALESCE;
if (enable) if (enable)
ahd->hs_mailbox |= ENINT_COALESS; ahd->hs_mailbox |= ENINT_COALESCE;
ahd_outb(ahd, HS_MAILBOX, ahd->hs_mailbox); ahd_outb(ahd, HS_MAILBOX, ahd->hs_mailbox);
ahd_flush_device_writes(ahd); ahd_flush_device_writes(ahd);
ahd_run_qoutfifo(ahd); ahd_run_qoutfifo(ahd);
...@@ -7718,20 +7719,20 @@ ahd_stat_timer(void *arg) ...@@ -7718,20 +7719,20 @@ ahd_stat_timer(void *arg)
} }
ahd_lock(ahd, &s); ahd_lock(ahd, &s);
enint_coal = ahd->hs_mailbox & ENINT_COALESS; enint_coal = ahd->hs_mailbox & ENINT_COALESCE;
if (ahd->cmdcmplt_total > ahd->int_coalessing_threshold) if (ahd->cmdcmplt_total > ahd->int_coalescing_threshold)
enint_coal |= ENINT_COALESS; enint_coal |= ENINT_COALESCE;
else if (ahd->cmdcmplt_total < ahd->int_coalessing_stop_threshold) else if (ahd->cmdcmplt_total < ahd->int_coalescing_stop_threshold)
enint_coal &= ~ENINT_COALESS; enint_coal &= ~ENINT_COALESCE;
if (enint_coal != (ahd->hs_mailbox & ENINT_COALESS)) { if (enint_coal != (ahd->hs_mailbox & ENINT_COALESCE)) {
ahd_enable_coalessing(ahd, enint_coal); ahd_enable_coalescing(ahd, enint_coal);
#ifdef AHD_DEBUG #ifdef AHD_DEBUG
if ((ahd_debug & AHD_SHOW_INT_COALESSING) != 0) if ((ahd_debug & AHD_SHOW_INT_COALESCING) != 0)
printf("%s: Interrupt coalessing " printf("%s: Interrupt coalescing "
"now %sabled. Cmds %d\n", "now %sabled. Cmds %d\n",
ahd_name(ahd), ahd_name(ahd),
(enint_coal & ENINT_COALESS) ? "en" : "dis", (enint_coal & ENINT_COALESCE) ? "en" : "dis",
ahd->cmdcmplt_total); ahd->cmdcmplt_total);
#endif #endif
} }
...@@ -8279,8 +8280,6 @@ ahd_loadseq(struct ahd_softc *ahd) ...@@ -8279,8 +8280,6 @@ ahd_loadseq(struct ahd_softc *ahd)
download_consts[PKT_OVERRUN_BUFOFFSET] = download_consts[PKT_OVERRUN_BUFOFFSET] =
(ahd->overrun_buf - (uint8_t *)ahd->qoutfifo) / 256; (ahd->overrun_buf - (uint8_t *)ahd->qoutfifo) / 256;
download_consts[SCB_TRANSFER_SIZE] = SCB_TRANSFER_SIZE_1BYTE_LUN; download_consts[SCB_TRANSFER_SIZE] = SCB_TRANSFER_SIZE_1BYTE_LUN;
if ((ahd->bugs & AHD_PKT_LUN_BUG) != 0)
download_consts[SCB_TRANSFER_SIZE] = SCB_TRANSFER_SIZE_FULL_LUN;
cur_patch = patches; cur_patch = patches;
downloaded = 0; downloaded = 0;
skip_addr = 0; skip_addr = 0;
......
...@@ -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#48 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#49 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -272,10 +272,6 @@ ahd_setup_scb_common(struct ahd_softc *ahd, struct scb *scb) ...@@ -272,10 +272,6 @@ ahd_setup_scb_common(struct ahd_softc *ahd, struct scb *scb)
if ((scb->flags & SCB_PACKETIZED) != 0) { if ((scb->flags & SCB_PACKETIZED) != 0) {
/* XXX what about ACA?? It is type 4, but TAG_TYPE == 0x3. */ /* XXX what about ACA?? It is type 4, but TAG_TYPE == 0x3. */
scb->hscb->task_attribute= scb->hscb->control & SCB_TAG_TYPE; scb->hscb->task_attribute= scb->hscb->control & SCB_TAG_TYPE;
/*
* For Rev A short lun workaround.
*/
scb->hscb->pkt_long_lun[6] = scb->hscb->lun;
} }
if (scb->hscb->cdb_len <= MAX_CDB_LEN_WITH_SENSE_ADDR if (scb->hscb->cdb_len <= MAX_CDB_LEN_WITH_SENSE_ADDR
......
/* /*
* Adaptec AIC79xx device driver for Linux. * Adaptec AIC79xx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#160 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#167 $
* *
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Copyright (c) 1994-2000 Justin T. Gibbs. * Copyright (c) 1994-2000 Justin T. Gibbs.
...@@ -62,11 +62,6 @@ ...@@ -62,11 +62,6 @@
#include <linux/mm.h> /* For fetching system memory size */ #include <linux/mm.h> /* For fetching system memory size */
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>
static int errno;
/* /*
* Lock protecting manipulation of the ahd softc list. * Lock protecting manipulation of the ahd softc list.
*/ */
...@@ -755,31 +750,11 @@ ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb, ...@@ -755,31 +750,11 @@ ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb,
consumed = 1; consumed = 1;
sg->addr = ahd_htole32(addr & 0xFFFFFFFF); sg->addr = ahd_htole32(addr & 0xFFFFFFFF);
scb->platform_data->xfer_len += len; scb->platform_data->xfer_len += len;
if (sizeof(bus_addr_t) > 4 if (sizeof(bus_addr_t) > 4
&& (ahd->flags & AHD_39BIT_ADDRESSING) != 0) { && (ahd->flags & AHD_39BIT_ADDRESSING) != 0)
/* len |= (addr >> 8) & AHD_SG_HIGH_ADDR_MASK;
* Due to DAC restrictions, we can't
* cross a 4GB boundary.
*/
if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) {
struct ahd_dma_seg *next_sg;
uint32_t next_len;
printf("Crossed Seg\n");
if ((scb->sg_count + 2) > AHD_NSEG)
panic("Too few segs for dma mapping. "
"Increase AHD_NSEG\n");
consumed++;
next_sg = sg + 1;
next_sg->addr = 0;
next_len = 0x100000000 - (addr & 0xFFFFFFFF);
len -= next_len;
next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000;
next_sg->len = ahd_htole32(next_len);
}
len |= (addr >> 8) & 0x7F000000;
}
sg->len = ahd_htole32(len); sg->len = ahd_htole32(len);
return (consumed); return (consumed);
} }
...@@ -796,14 +771,18 @@ static int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); ...@@ -796,14 +771,18 @@ static int ahd_linux_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *));
static int ahd_linux_slave_alloc(Scsi_Device *); static int ahd_linux_slave_alloc(Scsi_Device *);
static int ahd_linux_slave_configure(Scsi_Device *); static int ahd_linux_slave_configure(Scsi_Device *);
static void ahd_linux_slave_destroy(Scsi_Device *); static void ahd_linux_slave_destroy(Scsi_Device *);
#if defined(__i386__)
static int ahd_linux_biosparam(struct scsi_device*, static int ahd_linux_biosparam(struct scsi_device*,
struct block_device*, sector_t, int[]); struct block_device*, sector_t, int[]);
#endif
#else #else
static int ahd_linux_release(struct Scsi_Host *); static int ahd_linux_release(struct Scsi_Host *);
static void ahd_linux_select_queue_depth(struct Scsi_Host *host, static void ahd_linux_select_queue_depth(struct Scsi_Host *host,
Scsi_Device *scsi_devs); Scsi_Device *scsi_devs);
#if defined(__i386__)
static int ahd_linux_biosparam(Disk *, kdev_t, int[]); static int ahd_linux_biosparam(Disk *, kdev_t, int[]);
#endif #endif
#endif
static int ahd_linux_bus_reset(Scsi_Cmnd *); static int ahd_linux_bus_reset(Scsi_Cmnd *);
static int ahd_linux_dev_reset(Scsi_Cmnd *); static int ahd_linux_dev_reset(Scsi_Cmnd *);
static int ahd_linux_abort(Scsi_Cmnd *); static int ahd_linux_abort(Scsi_Cmnd *);
...@@ -1211,6 +1190,7 @@ ahd_linux_select_queue_depth(struct Scsi_Host * host, ...@@ -1211,6 +1190,7 @@ ahd_linux_select_queue_depth(struct Scsi_Host * host,
} }
#endif #endif
#if defined(__i386__)
/* /*
* Return the disk geometry for the given SCSI device. * Return the disk geometry for the given SCSI device.
*/ */
...@@ -1273,6 +1253,7 @@ ahd_linux_biosparam(Disk *disk, kdev_t dev, int geom[]) ...@@ -1273,6 +1253,7 @@ ahd_linux_biosparam(Disk *disk, kdev_t dev, int geom[])
geom[2] = cylinders; geom[2] = cylinders;
return (0); return (0);
} }
#endif
/* /*
* Abort the current SCSI command(s). * Abort the current SCSI command(s).
...@@ -4211,7 +4192,7 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev) ...@@ -4211,7 +4192,7 @@ ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
/* /*
* SCSI controller interrupt handler. * SCSI controller interrupt handler.
*/ */
AIC_LINUX_IRQRETURN_T irqreturn_t
ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
{ {
struct ahd_softc *ahd; struct ahd_softc *ahd;
...@@ -4225,7 +4206,7 @@ ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ...@@ -4225,7 +4206,7 @@ ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
ahd_schedule_runq(ahd); ahd_schedule_runq(ahd);
ahd_linux_run_complete_queue(ahd); ahd_linux_run_complete_queue(ahd);
ahd_unlock(ahd, &flags); ahd_unlock(ahd, &flags);
AIC_LINUX_IRQRETURN(ours); return IRQ_RETVAL(ours);
} }
void void
......
...@@ -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#130 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#132 $
* *
*/ */
#ifndef _AIC79XX_LINUX_H_ #ifndef _AIC79XX_LINUX_H_
...@@ -1211,7 +1211,7 @@ void ahd_platform_set_tags(struct ahd_softc *ahd, ...@@ -1211,7 +1211,7 @@ void ahd_platform_set_tags(struct ahd_softc *ahd,
int ahd_platform_abort_scbs(struct ahd_softc *ahd, int target, int ahd_platform_abort_scbs(struct ahd_softc *ahd, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status); role_t role, uint32_t status);
AIC_LINUX_IRQRETURN_T irqreturn_t
ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs); ahd_linux_isr(int irq, void *dev_id, struct pt_regs * regs);
void ahd_platform_flushwork(struct ahd_softc *ahd); void ahd_platform_flushwork(struct ahd_softc *ahd);
int ahd_softc_comp(struct ahd_softc *, struct ahd_softc *); int ahd_softc_comp(struct ahd_softc *, struct ahd_softc *);
......
...@@ -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_pci.c#21 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#23 $
*/ */
#include "aic79xx_osm.h" #include "aic79xx_osm.h"
...@@ -156,19 +156,21 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -156,19 +156,21 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master(pdev); pci_set_master(pdev);
if (sizeof(bus_addr_t) > 4) { if (sizeof(bus_addr_t) > 4) {
uint64_t memsize; uint64_t memsize;
bus_addr_t mask_64bit;
bus_addr_t mask_39bit;
memsize = ahd_linux_get_memsize(); memsize = ahd_linux_get_memsize();
if (memsize >= 0x8000000000 mask_64bit = (bus_addr_t)(0xFFFFFFFFFFFFFFFFULL&(bus_addr_t)~0);
&& ahd_pci_set_dma_mask(pdev, 0xFFFFFFFFFFFFFFFFULL) == 0) { mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL&(bus_addr_t)~0);
if (memsize >= 0x8000000000ULL
&& ahd_pci_set_dma_mask(pdev, mask_64bit) == 0) {
ahd->flags |= AHD_64BIT_ADDRESSING; ahd->flags |= AHD_64BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = ahd->platform_data->hw_dma_mask = mask_64bit;
(bus_addr_t)(0xFFFFFFFFFFFFFFFFULL&(bus_addr_t)~0);
} else if (memsize > 0x80000000 } else if (memsize > 0x80000000
&& ahd_pci_set_dma_mask(pdev, 0x7FFFFFFFFFULL) == 0) { && ahd_pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahd->flags |= AHD_39BIT_ADDRESSING; ahd->flags |= AHD_39BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = ahd->platform_data->hw_dma_mask = mask_39bit;
(bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
} }
} else { } else {
ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF); ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF);
......
...@@ -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#71 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#73 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -65,28 +65,29 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) ...@@ -65,28 +65,29 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
} }
#define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull #define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull
#define ID_ALL_IROC_MASK 0xFFFFFF7FFFFFFFFFull
#define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull #define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull
#define ID_9005_GENERIC_MASK 0xFFF0FFFF00000000ull #define ID_9005_GENERIC_MASK 0xFFF0FFFF00000000ull
#define ID_9005_GENERIC_IROC_MASK 0xFFF0FF7F00000000ull
#define ID_AIC7901 0x800F9005FFFF9005ull #define ID_AIC7901 0x800F9005FFFF9005ull
#define ID_AIC7901A 0x801E9005FFFF9005ull
#define ID_AIC7901A_IROC 0x809E9005FFFF9005ull
#define ID_AHA_29320A 0x8000900500609005ull #define ID_AHA_29320A 0x8000900500609005ull
#define ID_AHA_29320ALP 0x8017900500449005ull
#define ID_AIC7901A 0x801E9005FFFF9005ull
#define ID_AHA_29320 0x8012900500429005ull
#define ID_AHA_29320B 0x8013900500439005ull
#define ID_AHA_29320LP 0x8014900500449005ull #define ID_AHA_29320LP 0x8014900500449005ull
#define ID_AHA_29320LP_IROC 0x8094900500449005ull
#define ID_AIC7902 0x801F9005FFFF9005ull #define ID_AIC7902 0x801F9005FFFF9005ull
#define ID_AIC7902_IROC 0x809F9005FFFF9005ull
#define ID_AIC7902_B 0x801D9005FFFF9005ull #define ID_AIC7902_B 0x801D9005FFFF9005ull
#define ID_AIC7902_B_IROC 0x809D9005FFFF9005ull
#define ID_AHA_39320 0x8010900500409005ull #define ID_AHA_39320 0x8010900500409005ull
#define ID_AHA_39320_B 0x8015900500409005ull
#define ID_AHA_39320A 0x8016900500409005ull #define ID_AHA_39320A 0x8016900500409005ull
#define ID_AHA_39320D 0x8011900500419005ull #define ID_AHA_39320D 0x8011900500419005ull
#define ID_AHA_39320D_B 0x801C900500419005ull #define ID_AHA_39320D_B 0x801C900500419005ull
#define ID_AHA_39320D_HP 0x8011900500AC0E11ull #define ID_AHA_39320D_HP 0x8011900500AC0E11ull
#define ID_AHA_39320D_B_HP 0x801C900500AC0E11ull #define ID_AHA_39320D_B_HP 0x801C900500AC0E11ull
#define ID_AHA_29320 0x8012900500429005ull
#define ID_AHA_29320B 0x8013900500439005ull
#define ID_AIC7902_PCI_REV_A4 0x3 #define ID_AIC7902_PCI_REV_A4 0x3
#define ID_AIC7902_PCI_REV_B0 0x10 #define ID_AIC7902_PCI_REV_B0 0x10
#define SUBID_HP 0x0E11 #define SUBID_HP 0x0E11
...@@ -113,22 +114,42 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) ...@@ -113,22 +114,42 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
#define SUBID_9005_SEEPTYPE_NONE 0x0 #define SUBID_9005_SEEPTYPE_NONE 0x0
#define SUBID_9005_SEEPTYPE_4K 0x1 #define SUBID_9005_SEEPTYPE_4K 0x1
static ahd_device_setup_t ahd_aic7901_setup;
static ahd_device_setup_t ahd_aic7901A_setup; static ahd_device_setup_t ahd_aic7901A_setup;
static ahd_device_setup_t ahd_aic7902_setup; static ahd_device_setup_t ahd_aic7902_setup;
struct ahd_pci_identity ahd_pci_ident_table [] = struct ahd_pci_identity ahd_pci_ident_table [] =
{ {
/* aic7901 based controllers */
{
ID_AHA_29320A,
ID_ALL_MASK,
"Adaptec 29320A Ultra320 SCSI adapter",
ahd_aic7901_setup
},
{
ID_AHA_29320ALP,
ID_ALL_MASK,
"Adaptec 29320ALP Ultra320 SCSI adapter",
ahd_aic7901_setup
},
/* aic7901A based controllers */ /* aic7901A based controllers */
{ {
ID_AHA_29320LP, ID_AHA_29320,
ID_ALL_MASK, ID_ALL_MASK,
"Adaptec 29320LP Ultra320 SCSI adapter", "Adaptec 29320 Ultra320 SCSI adapter",
ahd_aic7901A_setup ahd_aic7901A_setup
}, },
{ {
ID_AHA_29320A, ID_AHA_29320B,
ID_ALL_MASK, ID_ALL_MASK,
"Adaptec 29320A Ultra320 SCSI adapter", "Adaptec 29320B Ultra320 SCSI adapter",
ahd_aic7901A_setup
},
{
ID_AHA_29320LP,
ID_ALL_MASK,
"Adaptec 29320LP Ultra320 SCSI adapter",
ahd_aic7901A_setup ahd_aic7901A_setup
}, },
/* aic7902 based controllers */ /* aic7902 based controllers */
...@@ -138,6 +159,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] = ...@@ -138,6 +159,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] =
"Adaptec 39320 Ultra320 SCSI adapter", "Adaptec 39320 Ultra320 SCSI adapter",
ahd_aic7902_setup ahd_aic7902_setup
}, },
{
ID_AHA_39320_B,
ID_ALL_MASK,
"Adaptec 39320 Ultra320 SCSI adapter",
ahd_aic7902_setup
},
{ {
ID_AHA_39320A, ID_AHA_39320A,
ID_ALL_MASK, ID_ALL_MASK,
...@@ -181,6 +208,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] = ...@@ -181,6 +208,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] =
ahd_aic7902_setup ahd_aic7902_setup
}, },
/* Generic chip probes for devices we don't know 'exactly' */ /* Generic chip probes for devices we don't know 'exactly' */
{
ID_AIC7901 & ID_DEV_VENDOR_MASK,
ID_DEV_VENDOR_MASK,
"Adaptec AIC7901 Ultra320 SCSI adapter",
ahd_aic7901_setup
},
{ {
ID_AIC7901A & ID_DEV_VENDOR_MASK, ID_AIC7901A & ID_DEV_VENDOR_MASK,
ID_DEV_VENDOR_MASK, ID_DEV_VENDOR_MASK,
...@@ -332,9 +365,9 @@ ahd_pci_config(struct ahd_softc *ahd, struct ahd_pci_identity *entry) ...@@ -332,9 +365,9 @@ ahd_pci_config(struct ahd_softc *ahd, struct ahd_pci_identity *entry)
} }
/* Ensure busmastering is enabled */ /* Ensure busmastering is enabled */
command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/1); command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
command |= PCIM_CMD_BUSMASTEREN; command |= PCIM_CMD_BUSMASTEREN;
ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/1); ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
error = ahd_softc_init(ahd); error = ahd_softc_init(ahd);
if (error != 0) if (error != 0)
...@@ -867,6 +900,18 @@ ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat) ...@@ -867,6 +900,18 @@ ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat)
ahd_restore_modes(ahd, saved_modes); ahd_restore_modes(ahd, saved_modes);
} }
static int
ahd_aic7901_setup(struct ahd_softc *ahd)
{
int error;
error = ahd_aic7902_setup(ahd);
if (error != 0)
return (error);
ahd->chip = AHD_AIC7901;
return (0);
}
static int static int
ahd_aic7901A_setup(struct ahd_softc *ahd) ahd_aic7901A_setup(struct ahd_softc *ahd)
{ {
...@@ -890,7 +935,7 @@ ahd_aic7902_setup(struct ahd_softc *ahd) ...@@ -890,7 +935,7 @@ ahd_aic7902_setup(struct ahd_softc *ahd)
if (rev < ID_AIC7902_PCI_REV_A4) { if (rev < ID_AIC7902_PCI_REV_A4) {
printf("%s: Unable to attach to unsupported chip revision %d\n", printf("%s: Unable to attach to unsupported chip revision %d\n",
ahd_name(ahd), rev); ahd_name(ahd), rev);
ahd_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/1); ahd_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2);
return (ENXIO); return (ENXIO);
} }
ahd->channel = ahd_get_pci_function(pci) + 'A'; ahd->channel = ahd_get_pci_function(pci) + 'A';
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated * DO NOT EDIT - This file is automatically generated
* from the following source files: * from the following source files:
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#93 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#68 $
*/ */
typedef int (ahd_reg_print_t)(u_int, u_int *, u_int); typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
typedef struct ahd_reg_parse_entry { typedef struct ahd_reg_parse_entry {
...@@ -2134,24 +2134,24 @@ ahd_reg_print_t ahd_allocfifo_scbptr_print; ...@@ -2134,24 +2134,24 @@ ahd_reg_print_t ahd_allocfifo_scbptr_print;
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_timer_print; ahd_reg_print_t ahd_int_coalescing_timer_print;
#else #else
#define ahd_int_coalessing_timer_print(regvalue, cur_col, wrap) \ #define ahd_int_coalescing_timer_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_TIMER", 0x14a, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "INT_COALESCING_TIMER", 0x14a, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_maxcmds_print; ahd_reg_print_t ahd_int_coalescing_maxcmds_print;
#else #else
#define ahd_int_coalessing_maxcmds_print(regvalue, cur_col, wrap) \ #define ahd_int_coalescing_maxcmds_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_MAXCMDS", 0x14c, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "INT_COALESCING_MAXCMDS", 0x14c, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_mincmds_print; ahd_reg_print_t ahd_int_coalescing_mincmds_print;
#else #else
#define ahd_int_coalessing_mincmds_print(regvalue, cur_col, wrap) \ #define ahd_int_coalescing_mincmds_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_MINCMDS", 0x14d, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "INT_COALESCING_MINCMDS", 0x14d, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
...@@ -2162,10 +2162,10 @@ ahd_reg_print_t ahd_cmds_pending_print; ...@@ -2162,10 +2162,10 @@ ahd_reg_print_t ahd_cmds_pending_print;
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
ahd_reg_print_t ahd_int_coalessing_cmdcount_print; ahd_reg_print_t ahd_int_coalescing_cmdcount_print;
#else #else
#define ahd_int_coalessing_cmdcount_print(regvalue, cur_col, wrap) \ #define ahd_int_coalescing_cmdcount_print(regvalue, cur_col, wrap) \
ahd_print_register(NULL, 0, "INT_COALESSING_CMDCOUNT", 0x150, regvalue, cur_col, wrap) ahd_print_register(NULL, 0, "INT_COALESCING_CMDCOUNT", 0x150, regvalue, cur_col, wrap)
#endif #endif
#if AIC_DEBUG_REGISTERS #if AIC_DEBUG_REGISTERS
...@@ -2432,7 +2432,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -2432,7 +2432,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define HS_MAILBOX 0x0b #define HS_MAILBOX 0x0b
#define HOST_TQINPOS 0x80 #define HOST_TQINPOS 0x80
#define ENINT_COALESS 0x40 #define ENINT_COALESCE 0x40
#define CLRSEQINTSTAT 0x0c #define CLRSEQINTSTAT 0x0c
#define CLRSEQ_SWTMRTO 0x10 #define CLRSEQ_SWTMRTO 0x10
...@@ -3612,15 +3612,15 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3612,15 +3612,15 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
#define ALLOCFIFO_SCBPTR 0x148 #define ALLOCFIFO_SCBPTR 0x148
#define INT_COALESSING_TIMER 0x14a #define INT_COALESCING_TIMER 0x14a
#define INT_COALESSING_MAXCMDS 0x14c #define INT_COALESCING_MAXCMDS 0x14c
#define INT_COALESSING_MINCMDS 0x14d #define INT_COALESCING_MINCMDS 0x14d
#define CMDS_PENDING 0x14e #define CMDS_PENDING 0x14e
#define INT_COALESSING_CMDCOUNT 0x150 #define INT_COALESCING_CMDCOUNT 0x150
#define LOCAL_HS_MAILBOX 0x151 #define LOCAL_HS_MAILBOX 0x151
...@@ -3768,5 +3768,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; ...@@ -3768,5 +3768,5 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print;
/* Exported Labels */ /* Exported Labels */
#define LABEL_seq_isr 0x270 #define LABEL_seq_isr 0x271
#define LABEL_timer_isr 0x26c #define LABEL_timer_isr 0x26d
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
* DO NOT EDIT - This file is automatically generated * DO NOT EDIT - This file is automatically generated
* from the following source files: * from the following source files:
* *
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#91 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#93 $
* $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#67 $ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#68 $
*/ */
#include "aic79xx_osm.h" #include "aic79xx_osm.h"
...@@ -161,7 +161,7 @@ ahd_hescb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -161,7 +161,7 @@ ahd_hescb_qoff_print(u_int regvalue, u_int *cur_col, u_int wrap)
} }
static ahd_reg_parse_entry_t HS_MAILBOX_parse_table[] = { static ahd_reg_parse_entry_t HS_MAILBOX_parse_table[] = {
{ "ENINT_COALESS", 0x40, 0x40 }, { "ENINT_COALESCE", 0x40, 0x40 },
{ "HOST_TQINPOS", 0x80, 0x80 } { "HOST_TQINPOS", 0x80, 0x80 }
}; };
...@@ -3375,23 +3375,23 @@ ahd_allocfifo_scbptr_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -3375,23 +3375,23 @@ ahd_allocfifo_scbptr_print(u_int regvalue, u_int *cur_col, u_int wrap)
} }
int int
ahd_int_coalessing_timer_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_int_coalescing_timer_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(NULL, 0, "INT_COALESSING_TIMER", return (ahd_print_register(NULL, 0, "INT_COALESCING_TIMER",
0x14a, regvalue, cur_col, wrap)); 0x14a, regvalue, cur_col, wrap));
} }
int int
ahd_int_coalessing_maxcmds_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_int_coalescing_maxcmds_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(NULL, 0, "INT_COALESSING_MAXCMDS", return (ahd_print_register(NULL, 0, "INT_COALESCING_MAXCMDS",
0x14c, regvalue, cur_col, wrap)); 0x14c, regvalue, cur_col, wrap));
} }
int int
ahd_int_coalessing_mincmds_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_int_coalescing_mincmds_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(NULL, 0, "INT_COALESSING_MINCMDS", return (ahd_print_register(NULL, 0, "INT_COALESCING_MINCMDS",
0x14d, regvalue, cur_col, wrap)); 0x14d, regvalue, cur_col, wrap));
} }
...@@ -3403,9 +3403,9 @@ ahd_cmds_pending_print(u_int regvalue, u_int *cur_col, u_int wrap) ...@@ -3403,9 +3403,9 @@ ahd_cmds_pending_print(u_int regvalue, u_int *cur_col, u_int wrap)
} }
int int
ahd_int_coalessing_cmdcount_print(u_int regvalue, u_int *cur_col, u_int wrap) ahd_int_coalescing_cmdcount_print(u_int regvalue, u_int *cur_col, u_int wrap)
{ {
return (ahd_print_register(NULL, 0, "INT_COALESSING_CMDCOUNT", return (ahd_print_register(NULL, 0, "INT_COALESCING_CMDCOUNT",
0x150, regvalue, cur_col, wrap)); 0x150, regvalue, cur_col, wrap));
} }
......
This diff is collapsed.
/* /*
* Adaptec AIC7xxx device driver for Linux. * Adaptec AIC7xxx device driver for Linux.
* *
* $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#221 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#229 $
* *
* Copyright (c) 1994 John Aycock * Copyright (c) 1994 John Aycock
* The University of Calgary Department of Computer Science. * The University of Calgary Department of Computer Science.
...@@ -141,11 +141,6 @@ ...@@ -141,11 +141,6 @@
#include <linux/mm.h> /* For fetching system memory size */ #include <linux/mm.h> /* For fetching system memory size */
#include <linux/blk.h> /* For block_size() */ #include <linux/blk.h> /* For block_size() */
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>
static int errno;
/* /*
* Lock protecting manipulation of the ahc softc list. * Lock protecting manipulation of the ahc softc list.
*/ */
...@@ -746,31 +741,11 @@ ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb, ...@@ -746,31 +741,11 @@ ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
consumed = 1; consumed = 1;
sg->addr = ahc_htole32(addr & 0xFFFFFFFF); sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
scb->platform_data->xfer_len += len; scb->platform_data->xfer_len += len;
if (sizeof(bus_addr_t) > 4 if (sizeof(bus_addr_t) > 4
&& (ahc->flags & AHC_39BIT_ADDRESSING) != 0) { && (ahc->flags & AHC_39BIT_ADDRESSING) != 0)
/* len |= (addr >> 8) & AHC_SG_HIGH_ADDR_MASK;
* Due to DAC restrictions, we can't
* cross a 4GB boundary.
*/
if ((addr ^ (addr + len - 1)) & ~0xFFFFFFFF) {
struct ahc_dma_seg *next_sg;
uint32_t next_len;
printf("Crossed Seg\n");
if ((scb->sg_count + 2) > AHC_NSEG)
panic("Too few segs for dma mapping. "
"Increase AHC_NSEG\n");
consumed++;
next_sg = sg + 1;
next_sg->addr = 0;
next_len = 0x100000000 - (addr & 0xFFFFFFFF);
len -= next_len;
next_len |= ((addr >> 8) + 0x1000000) & 0x7F000000;
next_sg->len = ahc_htole32(next_len);
}
len |= (addr >> 8) & 0x7F000000;
}
sg->len = ahc_htole32(len); sg->len = ahc_htole32(len);
return (consumed); return (consumed);
} }
...@@ -1195,10 +1170,10 @@ ahc_linux_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs) ...@@ -1195,10 +1170,10 @@ ahc_linux_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs)
} }
#endif #endif
#if defined(__i386__)
/* /*
* Return the disk geometry for the given SCSI device. * Return the disk geometry for the given SCSI device.
*/ */
#if defined(__i386__)
static int static int
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev, ahc_linux_biosparam(struct scsi_device *sdev, struct block_device *bdev,
...@@ -1747,7 +1722,7 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template) ...@@ -1747,7 +1722,7 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
struct Scsi_Host *host; struct Scsi_Host *host;
char *new_name; char *new_name;
u_long s; u_long s;
u_int target; u_int targ_offset;
template->name = ahc->description; template->name = ahc->description;
host = scsi_register(template, sizeof(struct ahc_softc *)); host = scsi_register(template, sizeof(struct ahc_softc *));
...@@ -1802,14 +1777,19 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template) ...@@ -1802,14 +1777,19 @@ ahc_linux_register_host(struct ahc_softc *ahc, Scsi_Host_Template *template)
* negotiation will occur for the first command, and DV * negotiation will occur for the first command, and DV
* will comence should that first command be successful. * will comence should that first command be successful.
*/ */
for (target = 0; for (targ_offset = 0;
target < host->max_id * (host->max_channel + 1); target++) { targ_offset < host->max_id * (host->max_channel + 1);
targ_offset++) {
u_int channel; u_int channel;
u_int target;
channel = 0; channel = 0;
target = targ_offset;
if (target > 7 if (target > 7
&& (ahc->features & AHC_TWIN) != 0) && (ahc->features & AHC_TWIN) != 0) {
channel = 1; channel = 1;
target &= 0x7;
}
/* /*
* Skip our own ID. Some Compaq/HP storage devices * Skip our own ID. Some Compaq/HP storage devices
* have enclosure management devices that respond to * have enclosure management devices that respond to
...@@ -2443,8 +2423,10 @@ ahc_linux_dv_target(struct ahc_softc *ahc, u_int target_offset) ...@@ -2443,8 +2423,10 @@ ahc_linux_dv_target(struct ahc_softc *ahc, u_int target_offset)
ahc_unlock(ahc, &s); ahc_unlock(ahc, &s);
return; return;
} }
ahc_compile_devinfo(&devinfo, ahc->our_id, targ->target, /*lun*/0, ahc_compile_devinfo(&devinfo,
targ->channel + 'A', ROLE_INITIATOR); targ->channel == 0 ? ahc->our_id : ahc->our_id_b,
targ->target, /*lun*/0, targ->channel + 'A',
ROLE_INITIATOR);
#ifdef AHC_DEBUG #ifdef AHC_DEBUG
if (ahc_debug & AHC_SHOW_DV) { if (ahc_debug & AHC_SHOW_DV) {
ahc_print_devinfo(ahc, &devinfo); ahc_print_devinfo(ahc, &devinfo);
...@@ -3881,7 +3863,7 @@ ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev) ...@@ -3881,7 +3863,7 @@ ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
/* /*
* SCSI controller interrupt handler. * SCSI controller interrupt handler.
*/ */
AIC_LINUX_IRQRETURN_T irqreturn_t
ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
{ {
struct ahc_softc *ahc; struct ahc_softc *ahc;
...@@ -3895,7 +3877,7 @@ ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs) ...@@ -3895,7 +3877,7 @@ ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs)
ahc_schedule_runq(ahc); ahc_schedule_runq(ahc);
ahc_linux_run_complete_queue(ahc); ahc_linux_run_complete_queue(ahc);
ahc_unlock(ahc, &flags); ahc_unlock(ahc, &flags);
AIC_LINUX_IRQRETURN(ours); return IRQ_RETVAL(ours);
} }
void void
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,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/aic7xxx_osm.h#142 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#146 $
* *
*/ */
#ifndef _AIC7XXX_LINUX_H_ #ifndef _AIC7XXX_LINUX_H_
...@@ -305,7 +305,7 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec) ...@@ -305,7 +305,7 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec)
#define AHC_SCSI_HAS_HOST_LOCK 0 #define AHC_SCSI_HAS_HOST_LOCK 0
#endif #endif
#define AIC7XXX_DRIVER_VERSION "6.2.33" #define AIC7XXX_DRIVER_VERSION "6.2.35"
/**************************** Front End Queues ********************************/ /**************************** Front End Queues ********************************/
/* /*
...@@ -778,7 +778,7 @@ ahc_done_unlock(struct ahc_softc *ahc, unsigned long *flags) ...@@ -778,7 +778,7 @@ ahc_done_unlock(struct ahc_softc *ahc, unsigned long *flags)
} }
static __inline void static __inline void
ahc_list_lockinit(void) ahc_list_lockinit()
{ {
spin_lock_init(&ahc_list_spinlock); spin_lock_init(&ahc_list_spinlock);
} }
...@@ -1165,7 +1165,7 @@ void ahc_platform_set_tags(struct ahc_softc *ahc, ...@@ -1165,7 +1165,7 @@ void ahc_platform_set_tags(struct ahc_softc *ahc,
int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
char channel, int lun, u_int tag, char channel, int lun, u_int tag,
role_t role, uint32_t status); role_t role, uint32_t status);
AIC_LINUX_IRQRETURN_T irqreturn_t
ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs); ahc_linux_isr(int irq, void *dev_id, struct pt_regs * regs);
void ahc_platform_flushwork(struct ahc_softc *ahc); void ahc_platform_flushwork(struct ahc_softc *ahc);
int ahc_softc_comp(struct ahc_softc *, struct ahc_softc *); int ahc_softc_comp(struct ahc_softc *, struct ahc_softc *);
......
...@@ -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/aic7xxx_osm_pci.c#44 $ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#45 $
*/ */
#include "aic7xxx_osm.h" #include "aic7xxx_osm.h"
...@@ -110,6 +110,7 @@ static int ...@@ -110,6 +110,7 @@ static int
ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
char buf[80]; char buf[80];
bus_addr_t mask_39bit;
struct ahc_softc *ahc; struct ahc_softc *ahc;
ahc_dev_softc_t pci; ahc_dev_softc_t pci;
struct ahc_pci_identity *entry; struct ahc_pci_identity *entry;
...@@ -160,12 +161,12 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -160,12 +161,12 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
} }
pci_set_master(pdev); pci_set_master(pdev);
mask_39bit = (bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
if (sizeof(bus_addr_t) > 4 if (sizeof(bus_addr_t) > 4
&& ahc_linux_get_memsize() > 0x80000000 && ahc_linux_get_memsize() > 0x80000000
&& ahc_pci_set_dma_mask(pdev, 0x7FFFFFFFFFULL) == 0) { && ahc_pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahc->flags |= AHC_39BIT_ADDRESSING; ahc->flags |= AHC_39BIT_ADDRESSING;
ahc->platform_data->hw_dma_mask = ahc->platform_data->hw_dma_mask = mask_39bit;
(bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0);
} else { } else {
ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF); ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF);
ahc->platform_data->hw_dma_mask = 0xFFFFFFFF; ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,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/aic7xxx_pci.c#63 $ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#65 $
* *
* $FreeBSD$ * $FreeBSD$
*/ */
...@@ -834,10 +834,10 @@ ahc_pci_config(struct ahc_softc *ahc, struct ahc_pci_identity *entry) ...@@ -834,10 +834,10 @@ ahc_pci_config(struct ahc_softc *ahc, struct ahc_pci_identity *entry)
ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4); ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
/* Ensure busmastering is enabled */ /* Ensure busmastering is enabled */
command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1); command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
command |= PCIM_CMD_BUSMASTEREN; command |= PCIM_CMD_BUSMASTEREN;
ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/1); ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
/* On all PCI adapters, we allow SCB paging */ /* On all PCI adapters, we allow SCB paging */
ahc->flags |= AHC_PAGESCBS; ahc->flags |= AHC_PAGESCBS;
......
...@@ -60,12 +60,9 @@ ...@@ -60,12 +60,9 @@
/* /*
* Linux Interrupt Support. * Linux Interrupt Support.
*/ */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #ifndef IRQ_RETVAL
#define AIC_LINUX_IRQRETURN_T irqreturn_t typedef void irqreturn_t;
#define AIC_LINUX_IRQRETURN(ours) return (IRQ_RETVAL(ours)) #define IRQ_RETVAL(x)
#else
#define AIC_LINUX_IRQRETURN_T void
#define AIC_LINUX_IRQRETURN(ours) return
#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