summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2014-07-12 11:33:13 +0000
committerjsg <jsg@openbsd.org>2014-07-12 11:33:13 +0000
commit35505b2275c60031d90af3295f42a096b44b1eca (patch)
tree8c3c799f72c8ccc0f8a434cdfff5efdb1cd68713
parentsizeof(afh), afh being uint32, is cooler than literal "4" (diff)
downloadwireguard-openbsd-35505b2275c60031d90af3295f42a096b44b1eca.tar.xz
wireguard-openbsd-35505b2275c60031d90af3295f42a096b44b1eca.zip
Remove the qli driver for QLogic 4010 & 4022 iSCSI.
It was never enabled and is apparently unfinished. ok deraadt@ krw@ claudio@ kettenis@
-rw-r--r--sys/arch/i386/conf/GENERIC3
-rw-r--r--sys/dev/pci/files.pci7
-rw-r--r--sys/dev/pci/qli_pci.c1168
-rw-r--r--sys/dev/pci/qlireg.h647
4 files changed, 2 insertions, 1823 deletions
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC
index 7002ce796b7..ec307466322 100644
--- a/sys/arch/i386/conf/GENERIC
+++ b/sys/arch/i386/conf/GENERIC
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.778 2014/07/11 21:58:09 tedu Exp $
+# $OpenBSD: GENERIC,v 1.779 2014/07/12 11:33:13 jsg Exp $
#
# For further information on compiling OpenBSD kernels, see the config(8)
# man page.
@@ -452,7 +452,6 @@ ips* at pci? # IBM ServeRAID controllers
qlw* at pci? # QLogic ISP SCSI
qla* at pci? # QLogic ISP 2[123]xx FibreChannel
qle* at pci? # QLogic ISP 2[45]xx FibreChannel
-#qli* at pci? # QLogic 4010 & 4022 iSCSI
aic0 at isa? port 0x340 irq 11 # Adaptec 152[02] SCSI controllers
aic* at pcmcia? # PCMCIA based aic SCSI controllers
aic* at isapnp? # isapnp configured aic SCSI controllers
diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci
index e42e489fefe..f0676268757 100644
--- a/sys/dev/pci/files.pci
+++ b/sys/dev/pci/files.pci
@@ -1,4 +1,4 @@
-# $OpenBSD: files.pci,v 1.306 2014/04/12 05:06:58 dlg Exp $
+# $OpenBSD: files.pci,v 1.307 2014/07/12 11:33:13 jsg Exp $
# $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $
#
# Config file and device description for machine-independent PCI code.
@@ -247,11 +247,6 @@ file dev/pci/sli_pci.c sli_pci
attach sili at pci with sili_pci
file dev/pci/sili_pci.c sili_pci
-# QLogic iSCSI HBAs
-device qli: scsi
-attach qli at pci with qli_pci
-file dev/pci/qli_pci.c qli_pci
-
# Ethernet driver for DC21040-based boards
device de: ether, ifnet, ifmedia
attach de at pci
diff --git a/sys/dev/pci/qli_pci.c b/sys/dev/pci/qli_pci.c
deleted file mode 100644
index 159838b50e1..00000000000
--- a/sys/dev/pci/qli_pci.c
+++ /dev/null
@@ -1,1168 +0,0 @@
-/* $OpenBSD: qli_pci.c,v 1.21 2014/02/21 18:47:35 deraadt Exp $ */
-/*
- * Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
- * Copyright (c) 2007 David Collins <dave@davec.name>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "bio.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/buf.h>
-#include <sys/ioctl.h>
-#include <sys/device.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
-
-#include <dev/pci/pcidevs.h>
-#include <dev/pci/pcivar.h>
-
-#include <machine/bus.h>
-
-#include <scsi/scsi_all.h>
-#include <scsi/scsi_disk.h>
-#include <scsi/scsiconf.h>
-
-#include <dev/pci/qlireg.h>
-
-#if NBIO > 0
-#include <dev/biovar.h>
-#include <sys/sensors.h>
-#endif /* NBIO > 0 */
-
-#define DEVNAME(_s) ((_s)->sc_dev.dv_xname)
-
-struct qli_softc {
- struct device sc_dev;
-
- void *sc_ih;
- bus_space_tag_t sc_memt;
- bus_space_handle_t sc_memh;
- bus_size_t sc_memsize;
- bus_dma_tag_t sc_dmat;
-
- volatile struct qli_reg *sc_reg; /* pointer to registers */
-
- /* scsi ioctl from sd device */
- int (*sc_ioctl)(struct device *, u_long, caddr_t);
-
- int sc_ql4010; /* if set we are a QL4010 HBA */
- u_int32_t sc_resource; /* nr for semaphores */
-
- struct rwlock sc_lock;
-
- /* mailbox members */
- struct rwlock sc_mbox_lock;
- u_int32_t sc_mbox[QLI_MBOX_SIZE];
- int sc_mbox_flags;
-#define QLI_MBOX_F_INVALID (0x00)
-#define QLI_MBOX_F_PENDING (0x01)
-#define QLI_MBOX_F_WAKEUP (0x02)
-#define QLI_MBOX_F_POLL (0x04)
-
- /* firmware control block */
- struct qli_mem *sc_fw_cb;
-
- /* queues */
- unsigned int sc_queues_len;
- struct qli_mem *sc_queues;
- bus_addr_t sc_request_dva;
- struct qli_queue_entry *sc_request_ring;
-};
-
-/* #define QLI_DEBUG */
-#ifdef QLI_DEBUG
-#define DPRINTF(x...) do { if (qli_debug) printf(x); } while(0)
-#define DNPRINTF(n,x...) do { if (qli_debug & n) printf(x); } while(0)
-#define QLI_D_CMD 0x0001
-#define QLI_D_INTR 0x0002
-#define QLI_D_MISC 0x0004
-#define QLI_D_DMA 0x0008
-#define QLI_D_IOCTL 0x0010
-#define QLI_D_RW 0x0020
-#define QLI_D_MEM 0x0040
-#define QLI_D_CCB 0x0080
-#define QLI_D_SEM 0x0100
-#define QLI_D_MBOX 0x0200
-
-u_int32_t qli_debug = 0
- | QLI_D_CMD
- | QLI_D_INTR
- | QLI_D_MISC
- | QLI_D_DMA
- | QLI_D_IOCTL
- | QLI_D_RW
- | QLI_D_MEM
- | QLI_D_CCB
- | QLI_D_SEM
- | QLI_D_MBOX
- ;
-
-void qli_dump_mbox(struct qli_softc *, u_int32_t *);
-#else
-#define DPRINTF(x...)
-#define DNPRINTF(n,x...)
-#define qli_dump_mbox(x, y)
-#endif /* QLI_DEBUG */
-
-struct qli_mem {
- bus_dmamap_t am_map;
- bus_dma_segment_t am_seg;
- size_t am_size;
- caddr_t am_kva;
-};
-
-#define QLIMEM_MAP(_am) ((_am)->am_map)
-#define QLIMEM_DVA(_am) ((_am)->am_map->dm_segs[0].ds_addr)
-#define QLIMEM_KVA(_am) ((void *)(_am)->am_kva)
-#define QLIMEM_ALIGN (MAX(QLI_REQUESTQ_DEPTH, QLI_RESPONSEQ_DEPTH) *\
- sizeof(struct qli_queue_entry))
-
-struct qli_mem *qli_allocmem(struct qli_softc *, size_t);
-void qli_freemem(struct qli_softc *, struct qli_mem *);
-void qli_scsi_cmd(struct scsi_xfer *);
-int qli_scsi_ioctl(struct scsi_link *, u_long, caddr_t, int,
- struct proc *);
-void qliminphys(struct buf *bp, struct scsi_link *sl);
-void qli_disable_interrupts(struct qli_softc *);
-void qli_enable_interrupts(struct qli_softc *);
-int qli_pci_find_device(void *);
-int qli_pci_match(struct device *, void *, void *);
-void qli_pci_attach(struct device *, struct device *, void *);
-int qli_ioctl(struct device *, u_long, caddr_t);
-int qli_lock_sem(struct qli_softc *, u_int32_t, u_int32_t);
-void qli_unlock_sem(struct qli_softc *, u_int32_t);
-void qli_eeprom_out(struct qli_softc *, u_int32_t);
-u_int16_t qli_read_nvram(struct qli_softc *, u_int32_t);
-int qli_validate_nvram(struct qli_softc *);
-int qli_lock_driver(struct qli_softc *);
-void qli_write(struct qli_softc *, volatile u_int32_t *, u_int32_t);
-u_int32_t qli_read(struct qli_softc *, volatile u_int32_t *);
-void qli_hw_reset(struct qli_softc *);
-int qli_soft_reset(struct qli_softc *);
-int qli_get_fw_state(struct qli_softc *, u_int32_t *);
-int qli_start_firmware(struct qli_softc *);
-int qli_mgmt(struct qli_softc *, int, u_int32_t *);
-int qli_intr(void *);
-int qli_attach(struct qli_softc *);
-#ifndef SMALL_KERNEL
-int qli_create_sensors(struct qli_softc *);
-#endif /* SMALL_KERNEL */
-
-struct scsi_adapter qli_switch = {
- qli_scsi_cmd, qliminphys, 0, 0, qli_scsi_ioctl
-};
-
-struct cfdriver qli_cd = {
- NULL, "qli", DV_DULL
-};
-
-struct cfattach qli_pci_ca = {
- sizeof(struct qli_softc), qli_pci_match, qli_pci_attach
-};
-
-struct qli_pci_device {
- pcireg_t qpd_vendor;
- pcireg_t qpd_product;
- pcireg_t qpd_subvendor;
- pcireg_t qpd_subproduct;
- char *qpd_model;
- uint32_t qpd_flags;
-} qli_pci_devices[] = {
- { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP4022_HBA,
- 0, 0, "", 0 },
- { PCI_VENDOR_QLOGIC, PCI_PRODUCT_QLOGIC_ISP4010_HBA,
- 0, 0, "", 0 },
- { 0 }
-};
-
-int
-qli_pci_find_device(void *aux) {
- struct pci_attach_args *pa = aux;
- int i;
-
- for (i = 0; qli_pci_devices[i].qpd_vendor; i++) {
- if (qli_pci_devices[i].qpd_vendor == PCI_VENDOR(pa->pa_id) &&
- qli_pci_devices[i].qpd_product == PCI_PRODUCT(pa->pa_id)) {
- DNPRINTF(QLI_D_MISC, "qli_pci_find_device: %i\n", i);
- return (i);
- }
- }
-
- return (-1);
-}
-
-int
-qli_pci_match(struct device *parent, void *match, void *aux)
-{
- int i;
-
- if ((i = qli_pci_find_device(aux)) != -1) {
- DNPRINTF(QLI_D_MISC,
- "qli_pci_match: vendor: %04x product: %04x\n",
- qli_pci_devices[i].qpd_vendor,
- qli_pci_devices[i].qpd_product);
-
- return (1);
- }
- return (0);
-}
-
-void
-qli_pci_attach(struct device *parent, struct device *self, void *aux)
-{
- struct qli_softc *sc = (struct qli_softc *)self;
- struct pci_attach_args *pa = aux;
- const char *intrstr;
- pci_intr_handle_t ih;
- pcireg_t memtype;
- int r;
-
- /* find the appropriate memory base */
- for (r = PCI_MAPREG_START; r < PCI_MAPREG_END; r += sizeof(memtype)) {
- memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, r);
- if ((memtype & PCI_MAPREG_TYPE_MASK) == PCI_MAPREG_TYPE_MEM)
- break;
- }
- if (r >= PCI_MAPREG_END) {
- printf(": unable to locate system interface registers\n");
- return;
- }
- if (pci_mapreg_map(pa, r, memtype, BUS_SPACE_MAP_LINEAR, &sc->sc_memt,
- &sc->sc_memh, NULL, &sc->sc_memsize, 0)) {
- printf(": can't map controller pci space\n");
- return;
- }
- sc->sc_dmat = pa->pa_dmat;
-
- /* establish interrupt */
- if (pci_intr_map(pa, &ih)) {
- printf(": can't map interrupt\n");
- goto unmap;
- }
- intrstr = pci_intr_string(pa->pa_pc, ih);
- sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO, qli_intr, sc,
- DEVNAME(sc));
- if (!sc->sc_ih) {
- printf(": can't establish interrupt");
- if (intrstr)
- printf(" at %s", intrstr);
- printf("\n");
- goto unmap;
- }
-
- /* retrieve kva for register access */
- sc->sc_reg = bus_space_vaddr(sc->sc_memt, sc->sc_memh);
- if (sc->sc_reg == NULL) {
- printf(": can't map registers into kernel\n");
- goto intrdis;
- }
- printf(": %s\n", intrstr);
-
- sc->sc_ql4010 =
- PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_QLOGIC_ISP4010_HBA;
-
- if (qli_attach(sc)) {
- printf("%s: can't attach\n", DEVNAME(sc));
- goto intrdis;
- }
-
- return;
-intrdis:
- pci_intr_disestablish(pa->pa_pc, sc->sc_ih);
-unmap:
- sc->sc_ih = NULL;
- bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsize);
-}
-
-struct qli_mem *
-qli_allocmem(struct qli_softc *sc, size_t size)
-{
- struct qli_mem *mm;
- int nsegs;
-
- DNPRINTF(QLI_D_MEM, "%s: qli_allocmem: %d\n", DEVNAME(sc),
- size);
-
- mm = malloc(sizeof(*mm), M_DEVBUF, M_NOWAIT | M_ZERO);
- if (mm == NULL)
- return (NULL);
-
- mm->am_size = size;
-
- if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
- BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &mm->am_map) != 0)
- goto amfree;
-
- if (bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &mm->am_seg, 1,
- &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO) != 0)
- goto destroy;
-
- if (bus_dmamem_map(sc->sc_dmat, &mm->am_seg, nsegs, size, &mm->am_kva,
- BUS_DMA_NOWAIT) != 0)
- goto free;
-
- if (bus_dmamap_load(sc->sc_dmat, mm->am_map, mm->am_kva, size, NULL,
- BUS_DMA_NOWAIT) != 0)
- goto unmap;
-
- DNPRINTF(QLI_D_MEM, " kva: %p dva: %p map: %p\n",
- mm->am_kva, mm->am_map->dm_segs[0].ds_addr, mm->am_map);
-
- return (mm);
-
-unmap:
- bus_dmamem_unmap(sc->sc_dmat, mm->am_kva, size);
-free:
- bus_dmamem_free(sc->sc_dmat, &mm->am_seg, 1);
-destroy:
- bus_dmamap_destroy(sc->sc_dmat, mm->am_map);
-amfree:
- free(mm, M_DEVBUF);
-
- return (NULL);
-}
-
-void
-qli_freemem(struct qli_softc *sc, struct qli_mem *mm)
-{
- DNPRINTF(QLI_D_MEM, "%s: qli_freemem: %p\n", DEVNAME(sc), mm);
-
- bus_dmamap_unload(sc->sc_dmat, mm->am_map);
- bus_dmamem_unmap(sc->sc_dmat, mm->am_kva, mm->am_size);
- bus_dmamem_free(sc->sc_dmat, &mm->am_seg, 1);
- bus_dmamap_destroy(sc->sc_dmat, mm->am_map);
- free(mm, M_DEVBUF);
-}
-
-void
-qliminphys(struct buf *bp, struct scsi_link *sl)
-{
- DNPRINTF(QLI_D_MISC, "qliminphys: %d\n", bp->b_bcount);
-
- if (bp->b_bcount > QLI_MAXFER)
- bp->b_bcount = QLI_MAXFER;
- minphys(bp);
-}
-
-void
-qli_disable_interrupts(struct qli_softc *sc)
-{
- DNPRINTF(QLI_D_INTR, "%s: qli_disable_interrupts\n", DEVNAME(sc));
-
- if (sc->sc_ql4010)
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_CLR_MASK(QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE));
- else
- qli_write(sc, &sc->sc_reg->u1.isp4022.q22_intr_mask,
- QLI_CLR_MASK(QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE_4022));
-}
-
-void
-qli_enable_interrupts(struct qli_softc *sc)
-{
- DNPRINTF(QLI_D_INTR, "%s: qli_enable_interrupts\n", DEVNAME(sc));
-
- if (sc->sc_ql4010)
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE));
- else
- qli_write(sc, &sc->sc_reg->u1.isp4022.q22_intr_mask,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE_4022));
-}
-
-void
-qli_write(struct qli_softc *sc, volatile u_int32_t *p, u_int32_t v)
-{
- DNPRINTF(QLI_D_RW, "%s: qw 0x%x 0x%08x\n", DEVNAME(sc),
- (u_int8_t *)p - (u_int8_t *)sc->sc_reg, v);
-
- *p = letoh32(v);
- bus_space_barrier(sc->sc_memt, sc->sc_memh,
- (u_int8_t *)p - (u_int8_t *)sc->sc_reg, 4, BUS_SPACE_BARRIER_WRITE);
-}
-
-u_int32_t
-qli_read(struct qli_softc *sc, volatile u_int32_t *p)
-{
- u_int32_t v;
-
- bus_space_barrier(sc->sc_memt, sc->sc_memh,
- (u_int8_t *)p - (u_int8_t *)sc->sc_reg, 4, BUS_SPACE_BARRIER_READ);
- v = letoh32(*p);
-
- DNPRINTF(QLI_D_RW, "%s: qr 0x%x 0x%08x\n", DEVNAME(sc),
- (u_int8_t *)p - (u_int8_t *)sc->sc_reg, v);
- return (v);
-}
-
-void
-qli_hw_reset(struct qli_softc *sc)
-{
- u_int32_t s;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_hw_reset\n", DEVNAME(sc));
-
- /* clear scsi reset interrupt bit or soft reset won't work */
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if (s & QLI_REG_CTRLSTAT_SCSI_RESET_INTR)
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status, QLI_SET_MASK(s));
-
- /* issue soft reset */
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SOFT_RESET));
-}
-
-int
-qli_soft_reset(struct qli_softc *sc)
-{
- int rv = 1, i, failed;
- u_int32_t s;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_soft_reset\n", DEVNAME(sc));
-
- qli_hw_reset(sc);
-
- /* wait until net reset bit is cleared */
- for (i = 0; i < QLI_SOFT_RESET_RETRIES; i++) {
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if ((s & QLI_REG_CTRLSTAT_NET_RESET_INTR) == 0)
- break;
- delay(1000000); /* 1s */
- }
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if (s & QLI_REG_CTRLSTAT_NET_RESET_INTR) {
- printf("%s: qli_soft_reset: net reset intr bit not cleared\n",
- DEVNAME(sc));
- /* XXX set the same bit per the linux driver */
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_NET_RESET_INTR));
- }
-
- /* wait for soft reset to complete */
- for (i = 0, failed = 1; i < QLI_SOFT_RESET_RETRIES; i++) {
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if ((s & QLI_REG_CTRLSTAT_SOFT_RESET) == 0) {
- failed = 0;
- break;
- }
- delay(1000000); /* 1s */
- }
-
- /* check if scsi reset interrupt is cleared */
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if (s & QLI_REG_CTRLSTAT_SCSI_RESET_INTR) {
- printf("%s: qli_soft_reset: scsi reset intr bit not cleared\n",
- DEVNAME(sc));
- /* XXX set the same bit per the linux driver */
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_RESET_INTR));
- }
-
- if (failed) {
- /* force the soft reset */
- printf("%s: qli_soft_reset: soft reset failed\n", DEVNAME(sc));
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_FORCE_SOFT_RESET));
- for (i = 0; i < QLI_SOFT_RESET_RETRIES; i++) {
- s = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if ((s & QLI_REG_CTRLSTAT_FORCE_SOFT_RESET) == 0) {
- rv = 0;
- break;
- }
- delay(1000000); /* 1s */
- }
- } else
- rv = 0;
-
- return (rv);
-}
-
-int
-qli_get_fw_state(struct qli_softc *sc, u_int32_t *mbox)
-{
- int rv = 1;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_get_fw_state\n", DEVNAME(sc));
-
- mbox[0] = QLI_MBOX_OPC_GET_FW_STATE;
- if (qli_mgmt(sc, 1, mbox))
- goto done;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_get_fw_state: state: 0x%08x\n",
- DEVNAME(sc), mbox[1]);
- rv = 0;
-done:
- return (rv);
-}
-
-int
-qli_lock_driver(struct qli_softc *sc)
-{
- int i, rv = 1;
-
- DNPRINTF(QLI_D_SEM, "%s: qli_lock_driver\n", DEVNAME(sc));
-
- for (i = 0; i < QLI_SEM_MAX_RETRIES; i++) {
- if (qli_lock_sem(sc, QLI_SEM_DRIVER(sc),
- QLI_SEM_DRIVER_MASK(sc))) {
- DNPRINTF(QLI_D_SEM, "%s: qli_lock_driver: semaphore"
- " not acquired, retry %d\n", DEVNAME(sc), i);
- if (cold)
- delay(1000000); /* 1s */
- else
- while (tsleep(sc, PRIBIO + 1, "qlisem", hz) !=
- EWOULDBLOCK)
- ;
- } else {
- DNPRINTF(QLI_D_SEM, "%s: qli_lock_driver: semaphore"
- " acquired\n", DEVNAME(sc));
- rv = 0;
- break;
- }
- }
- return (rv);
-}
-
-void
-qli_unlock_sem(struct qli_softc *sc, u_int32_t mask)
-{
- DNPRINTF(QLI_D_SEM, "%s: qli_unlock_sem: 0x%08x released\n",
- DEVNAME(sc), mask);
-
- qli_write(sc, QLI_SEMAPHORE(sc), mask);
-}
-
-int
-qli_lock_sem(struct qli_softc *sc, u_int32_t shift, u_int32_t mask)
-{
- int rv = 1;
- u_int32_t v, s;
-
- s = sc->sc_resource << shift;
- qli_write(sc, QLI_SEMAPHORE(sc), s | mask);
- v = qli_read(sc, QLI_SEMAPHORE(sc));
-
- if ((v & (mask >> 16)) == s)
- rv = 0;
-
- DNPRINTF(QLI_D_SEM, "%s: qli_lock_sem: mask: 0x%08x shift: 0x%08x "
- "s: 0x%08x v: 0x%08x did %sacquire semaphore \n", DEVNAME(sc),
- mask, shift, s, v, rv ? "not " : "");
-
- return (rv);
-}
-
-void
-qli_eeprom_out(struct qli_softc *sc, u_int32_t data)
-{
- qli_write(sc, QLI_NVRAM(sc), data);
- delay(1);
-}
-
-u_int16_t
-qli_read_nvram(struct qli_softc *sc, u_int32_t offset)
-{
- int i;
- u_int32_t s, mask, data;
- u_int16_t val = 0;
-#ifdef QLI_DEBUG
- u_int32_t qli_debug_save = qli_debug;
-
- qli_debug = 0;
-#endif /* QLI_DEBUG */
-
- /* select chip */
- s = QLI_NVRAM_MASK | QLI_NVRAM_SELECT;
- qli_eeprom_out(sc, s);
-
- /* start bit */
- qli_eeprom_out(sc, s | QLI_NVRAM_DATA_OUT);
- qli_eeprom_out(sc, s | QLI_NVRAM_DATA_OUT | QLI_NVRAM_CLOCK);
- qli_eeprom_out(sc, s | QLI_NVRAM_DATA_OUT); /* clock low */
-
- /* send read command */
- mask = 1 << (QLI_NVRAM_NUM_CMD_BITS - 1);
- for (i = 0; i < QLI_NVRAM_NUM_CMD_BITS; i++) {
- data = ((QLI_NVRAM_CMD_READ << i) & mask) ?
- QLI_NVRAM_DATA_OUT : 0;
-
- qli_eeprom_out(sc, s | data);
- qli_eeprom_out(sc, s | data | QLI_NVRAM_CLOCK);
- qli_eeprom_out(sc, s | data);
- }
-
- /* send read address */
- mask = 1 << (QLI_NVRAM_NUM_ADDR_BITS(sc) - 1);
- for (i = 0; i < QLI_NVRAM_NUM_ADDR_BITS(sc); i++) {
- data = ((offset << i) & mask) ? QLI_NVRAM_DATA_OUT : 0;
- qli_eeprom_out(sc, s | data);
- qli_eeprom_out(sc, s | data | QLI_NVRAM_CLOCK);
- qli_eeprom_out(sc, s | data);
- }
-
- /* read data */
- for (i = 0; i < QLI_NVRAM_NUM_DATA_BITS; i++) {
- qli_eeprom_out(sc, s | QLI_NVRAM_CLOCK);
- qli_eeprom_out(sc, s);
- data = (qli_read(sc, QLI_NVRAM(sc)) & QLI_NVRAM_DATA_IN) ?
- 1 : 0;
- val = (val << 1) | data;
- }
-
- /* deselect chip */
- s = QLI_NVRAM_MASK;
- qli_write(sc, QLI_NVRAM(sc), s);
-
-#ifdef QLI_DEBUG
- qli_debug = qli_debug_save;
-#endif /* QLI_DEBUG */
-
- DNPRINTF(QLI_D_RW, "%s: qli_read_nvram 0x%x 0x%04x\n", DEVNAME(sc),
- offset, letoh16(val));
-
- return (letoh16(val));
-}
-
-int
-qli_validate_nvram(struct qli_softc *sc)
-{
- int i, rv = 1;
- u_int16_t nvram_checksum = 0;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_validate_nvram\n", DEVNAME(sc));
-
- for (i = 0; i < QLI_NVRAM_SIZE(sc); i++)
- nvram_checksum += qli_read_nvram(sc, i);
-
- DNPRINTF(QLI_D_MISC, "%s: nvram checksum 0x%04x\n", DEVNAME(sc),
- nvram_checksum);
-
- if (nvram_checksum == 0)
- rv = 0;
-
- return (rv);
-}
-
-int
-qli_start_firmware(struct qli_softc *sc) {
- int rv = 1, reset_required = 1, config_required = 0;
- int boot_required = 0, i;
- u_int32_t mbox[QLI_MBOX_SIZE], r;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware\n", DEVNAME(sc));
-
- if (qli_lock_driver(sc)) {
- printf("%s: could not acquire global driver semaphore, "
- "aborting firmware bring-up\n", DEVNAME(sc));
- goto done;
- }
-
- if (qli_read(sc, QLI_PORT_CTRL(sc)) & QLI_PORT_CTRL_INITIALIZED) {
- /* Hardware has been initialized */
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: hardware has "
- "been initialized\n", DEVNAME(sc));
-
- if (qli_read(sc, &sc->sc_reg->qlr_mbox[0]) == 0) {
- /* firmware is not running */
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: fw "
- "not running\n", DEVNAME(sc));
- reset_required = 0;
- config_required = 1;
- } else {
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_RESET_INTR));
-
- /* issue command to fw to find out if we are up */
- bzero(mbox, sizeof(mbox));
- if (qli_get_fw_state(sc, mbox)) {
- /* command failed, reset chip */
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: "
- "firmware in unknown state, reseting "
- "chip\n", DEVNAME(sc));
- } else {
- if (mbox[1] & QLI_MBOX_STATE_CONFIG_WAIT) {
- config_required = 1;
- reset_required = 0;
- }
- }
- }
- }
-
- if (reset_required) {
- if (qli_soft_reset(sc)) {
- printf("%s: soft reset failed, aborting firmware "
- "bring-up\n", DEVNAME(sc));
- goto done;
- }
- config_required = 1;
-
- if (qli_lock_driver(sc)) {
- printf("%s: could not acquire global driver semaphore "
- "after reseting chip, aborting firmware bring-up\n",
- DEVNAME(sc));
- goto done;
- }
- }
-
- if (config_required) {
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: configuring "
- "firmware\n", DEVNAME(sc));
-
- if (qli_lock_sem(sc, QLI_SEM_FLASH(sc),
- QLI_SEM_FLASH_MASK(sc))) {
- printf("%s: could not lock flash during firmware "
- "bring-up\n", DEVNAME(sc));
- goto unlock_driver;
- }
-
- if (qli_lock_sem(sc, QLI_SEM_NVRAM(sc),
- QLI_SEM_NVRAM_MASK(sc))) {
- printf("%s: could not lock nvram during firmware "
- "bring-up\n", DEVNAME(sc));
- qli_unlock_sem(sc, QLI_SEM_FLASH_MASK(sc));
- goto unlock_driver;
- }
-
- if (qli_validate_nvram(sc)) {
- printf("%s: invalid NVRAM checksum. Flash your "
- "controller", DEVNAME(sc));
-
- if (sc->sc_ql4010)
- r = QLI_EXT_HW_CFG_DEFAULT_QL4010;
- else
- r = QLI_EXT_HW_CFG_DEFAULT_QL4022;
- } else
- r = (u_int32_t)qli_read_nvram(sc,
- QLI_NVRAM_EXT_HW_CFG(sc));
-
- /* upper 16 bits are write mask; enable everything */
- qli_write(sc, QLI_EXT_HW_CFG(sc), (0xffff << 16 ) | r);
-
- qli_unlock_sem(sc, QLI_SEM_NVRAM_MASK(sc));
- qli_unlock_sem(sc, QLI_SEM_FLASH_MASK(sc));
-
- boot_required = 1;
- }
-
- if (boot_required) {
- /* boot firmware */
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: booting "
- "firmware\n", DEVNAME(sc));
-
- /* stuff random value in mbox[7] to randomize source ports */
- /* XXX use random ne instead of 1234 */
- qli_write(sc, &sc->sc_reg->qlr_mbox[7], 1234);
-
- /* XXX linux driver sets ACB v2 into mbox[6] */
-
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_BOOT_ENABLE));
-
- /* wait for firmware to come up */
- for (i = 0; i < 60 * 4 /* up to 60 seconds */; i ++) {
- if (qli_read(sc, &sc->sc_reg->qlr_ctrl_status) &
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_PROC_INTR))
- break;
- if (qli_read(sc, &sc->sc_reg->qlr_mbox[0]) ==
- QLI_MBOX_STATUS_COMMAND_COMPLETE)
- break;
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: waiting "
- "for firmware, retry = %d\n", DEVNAME(sc), i);
-
- delay(250000); /* 250ms */
- }
- if (qli_read(sc, &sc->sc_reg->qlr_mbox[0]) ==
- QLI_MBOX_STATUS_COMMAND_COMPLETE) {
- /* firmware is done booting */
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_PROC_INTR));
-
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: firmware "
- "booting complete\n", DEVNAME(sc));
-
- rv = 0;
- }
- else {
- DNPRINTF(QLI_D_MISC, "%s: qli_start_firmware: firmware "
- "booting failed\n", DEVNAME(sc));
- rv = 1;
- }
- }
-
-unlock_driver:
- qli_unlock_sem(sc, QLI_SEM_DRIVER_MASK(sc));
-done:
- return (rv);
-}
-
-int
-qli_mgmt(struct qli_softc *sc, int len, u_int32_t *mbox)
-{
- int rv = 1, s, i;
- u_int32_t x;
-
- DNPRINTF(QLI_D_MBOX, "%s: qli_mgmt: cold: %d\n", DEVNAME(sc), cold);
-
- if (!mbox)
- goto done;
-
- s = splbio();
- rw_enter_write(&sc->sc_mbox_lock);
-
- if (qli_read(sc, &sc->sc_reg->qlr_ctrl_status) &
- QLI_REG_CTRLSTAT_SCSI_PROC_INTR) {
- /* this should not happen */
- printf("%s: qli_mgmt called while interrupt is pending\n",
- DEVNAME(sc));
- qli_intr(sc);
- }
-
- qli_dump_mbox(sc, mbox);
-
- /* mbox[0] needs to be written last so write backwards */
- for (i = QLI_MBOX_SIZE - 1; i >= 0; i--)
- qli_write(sc, &sc->sc_reg->qlr_mbox[i], i < len ? mbox[i] : 0);
-
- /* notify chip it has to deal with mailbox */
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_EP_INTR));
-
- /* wait for completion */
- if (cold) {
- sc->sc_mbox_flags = QLI_MBOX_F_POLL;
- for (i = 0; i < 6000000 /* up to a minute */; i++) {
- delay(10);
- if ((qli_read(sc, &sc->sc_reg->qlr_ctrl_status) &
- (QLI_REG_CTRLSTAT_SCSI_RESET_INTR |
- QLI_REG_CTRLSTAT_SCSI_COMPL_INTR |
- QLI_REG_CTRLSTAT_SCSI_PROC_INTR))) {
- qli_intr(sc);
- break;
- }
- }
- } else {
- sc->sc_mbox_flags = QLI_MBOX_F_PENDING;
- while ((sc->sc_mbox_flags & QLI_MBOX_F_WAKEUP) == 0)
- tsleep(sc->sc_mbox, PRIBIO, "qli_mgmt", 0);
- }
-
- x = sc->sc_mbox[0];
- switch (x) {
- case QLI_MBOX_STATUS_COMMAND_COMPLETE:
- for (i = 0; i < QLI_MBOX_SIZE; i++)
- mbox[i] = sc->sc_mbox[i];
- sc->sc_mbox_flags = QLI_MBOX_F_INVALID;
- rv = 0;
-
- qli_dump_mbox(sc, mbox);
- break;
- default:
- printf("%s: qli_mgmt: mailbox failed opcode 0x%08x failed "
- "with error code 0x%08x\n", DEVNAME(sc), mbox[0], x);
- }
-
- rw_exit_write(&sc->sc_mbox_lock);
- splx(s);
-done:
- return (rv);
-}
-
-int
-qli_attach(struct qli_softc *sc)
-{
- /* struct scsibus_attach_args saa; */
- int rv = 1;
- u_int32_t f, mbox[QLI_MBOX_SIZE];
- unsigned int align;
-
- DNPRINTF(QLI_D_MISC, "%s: qli_attach\n", DEVNAME(sc));
-
- rw_init(&sc->sc_lock, "qli_lock");
- rw_init(&sc->sc_mbox_lock, "qli_mbox_lock");
-
- if (sc->sc_ql4010)
- sc->sc_resource = QLI_SEM_4010_SCSI;
- else {
- f = qli_read(sc, &sc->sc_reg->qlr_ctrl_status) &
- QLI_REG_CTRLSTAT_FUNC_MASK;
- sc->sc_resource = f >> 8;
- }
- DNPRINTF(QLI_D_MISC, "%s: qli_attach resource: %d\n", DEVNAME(sc),
- sc->sc_resource);
-
- if (qli_start_firmware(sc)) {
- printf("%s: could not start firmware\n", DEVNAME(sc));
- goto done;
- }
-
- bzero(mbox, sizeof(mbox));
- mbox[0] = QLI_MBOX_OPC_ABOUT_FIRMWARE;
- if (qli_mgmt(sc, 4, mbox)) {
- printf("%s: about firmware command failed\n", DEVNAME(sc));
- goto done;
- }
- printf("%s: version %d.%d.%d.%d\n", DEVNAME(sc), mbox[1], mbox[2],
- mbox[3], mbox[4]);
-
- /* get state */
- bzero(mbox, sizeof(mbox));
- if (qli_get_fw_state(sc, mbox)) {
- printf("%s: get firmware state command failed\n", DEVNAME(sc));
- goto done;
- }
-
- /* initialize firmware */
- sc->sc_fw_cb = qli_allocmem(sc, QLI_FW_CTRL_BLK_SIZE);
- if (sc->sc_fw_cb == NULL) {
- printf("%s: unable to allocate firmware control block memory\n",
- DEVNAME(sc));
- goto done;
- }
- bzero(mbox, sizeof(mbox));
- mbox[0] = QLI_MBOX_OPC_GET_INITIAL_FW_CB;
- mbox[2] = (u_int32_t)QLIMEM_DVA(sc->sc_fw_cb);
- mbox[3] = (u_int32_t)((u_int64_t)QLIMEM_DVA(sc->sc_fw_cb) >> 32);
- if (qli_mgmt(sc, 4, mbox)) {
- printf("%s: get initial firmware control block failed\n",
- DEVNAME(sc));
- goto nofwcb;
- }
-
- /* setup queues & shadow registers */
- sc->sc_queues_len = (QLI_REQUESTQ_DEPTH * QLI_QUEUE_SIZE) +
- (QLI_RESPONSEQ_DEPTH * QLI_QUEUE_SIZE) +
- sizeof(struct qli_shadow_regs) +
- QLIMEM_ALIGN + PAGE_SIZE - 1;
- sc->sc_queues_len &= ~(PAGE_SIZE - 1);
-
- sc->sc_queues = qli_allocmem(sc, sc->sc_queues_len);
- if (sc->sc_queues == NULL) {
- printf("%s: unable to allocate firmware control block memory\n",
- DEVNAME(sc));
- goto nofwcb;
- }
-
- if (QLIMEM_DVA(sc->sc_queues) & (QLIMEM_ALIGN - 1))
- align = QLIMEM_ALIGN -
- (QLIMEM_DVA(sc->sc_queues) & (QLIMEM_ALIGN - 1));
- else
- align = 0;
-
- sc->sc_request_dva = QLIMEM_DVA(sc->sc_queues) + align;
- sc->sc_request_ring = QLIMEM_KVA(sc->sc_queues) + align;
-
-#if 0
- /* enable interrupts */
- qli_enable_interrupts(sc);
-#endif
-
-#if NBIO > 0
- if (bio_register(&sc->sc_dev, qli_ioctl) != 0)
- panic("%s: controller registration failed", DEVNAME(sc));
- else
- sc->sc_ioctl = qli_ioctl;
-
-#ifndef SMALL_KERNEL
- if (qli_create_sensors(sc) != 0)
- printf("%s: unable to create sensors\n", DEVNAME(sc));
-#endif /* SMALL_KERNEL */
-#endif /* NBIO > 0 */
-
-done:
- return (rv);
-/* noqueues: */
- qli_freemem(sc, sc->sc_queues);
-nofwcb:
- qli_freemem(sc, sc->sc_fw_cb);
- return (rv);
-}
-
-void
-qli_scsi_cmd(struct scsi_xfer *xs)
-{
- int s;
-#ifdef QLI_DEBUG
- struct scsi_link *link = xs->sc_link;
- struct qli_softc *sc = link->adapter_softc;
-
- DNPRINTF(QLI_D_CMD, "%s: qli_scsi_cmd opcode: %#x\n",
- DEVNAME(sc), xs->cmd->opcode);
-#endif
-
- goto stuffup;
- return;
-
-stuffup:
- xs->error = XS_DRIVER_STUFFUP;
- scsi_done(xs);
-}
-
-int
-qli_intr(void *arg)
-{
- struct qli_softc *sc = arg;
- int claimed = 0, i;
- u_int32_t intr, mbox_status;
-
- intr = qli_read(sc, &sc->sc_reg->qlr_ctrl_status);
- if ((intr & (QLI_REG_CTRLSTAT_SCSI_RESET_INTR |
- QLI_REG_CTRLSTAT_SCSI_COMPL_INTR |
- QLI_REG_CTRLSTAT_SCSI_PROC_INTR |
- QLI_REG_CTRLSTAT_FATAL_ERROR)) == 0)
- goto done;
-
- DNPRINTF(QLI_D_INTR, "%s: qli_intr %#x cs: 0x%08x\n", DEVNAME(sc), sc,
- intr);
-
- if (intr & QLI_REG_CTRLSTAT_SCSI_RESET_INTR) {
- /* chip requests soft reset */
- /* XXX */
- panic("%s: qli_intr chip reset not implemented", DEVNAME(sc));
- }
-
- if (intr & QLI_REG_CTRLSTAT_FATAL_ERROR) {
- /* reset firmware */
- /* XXX */
- panic("%s: qli_intr chip hang recovery not implemented",
- DEVNAME(sc));
- }
-
- if (intr & QLI_REG_CTRLSTAT_SCSI_COMPL_INTR) {
- /* io completion */
- /* XXX */
- panic("%s: qli_intr io completion not implemented",
- DEVNAME(sc));
- }
-
- if (intr & QLI_REG_CTRLSTAT_SCSI_PROC_INTR) {
- /* mailbox completion */
- mbox_status = qli_read(sc, &sc->sc_reg->qlr_mbox[0]);
- switch (mbox_status >> QLI_MBOX_TYPE_SHIFT) {
- case QLI_MBOX_COMPLETION_STATUS:
- for (i = 0; i < QLI_MBOX_SIZE; i++)
- sc->sc_mbox[i] = qli_read(sc,
- &sc->sc_reg->qlr_mbox[i]);
- qli_write(sc, &sc->sc_reg->qlr_ctrl_status,
- QLI_SET_MASK(QLI_REG_CTRLSTAT_SCSI_PROC_INTR));
- if (sc->sc_mbox_flags & QLI_MBOX_F_PENDING) {
- sc->sc_mbox_flags |= QLI_MBOX_F_WAKEUP;
- wakeup(sc->sc_mbox);
- }
- claimed = 1;
- break;
- case QLI_MBOX_ASYNC_EVENT_STATUS:
- printf("%s: unhandled async event 0x%08x\n",
- DEVNAME(sc),
- qli_read(sc, &sc->sc_reg->qlr_mbox[0]));
- break;
- default:
- printf("%s: invalid mailbox return 0x%08x\n",
- DEVNAME(sc),
- qli_read(sc, &sc->sc_reg->qlr_mbox[0]));
- break;
- }
- }
-
-done:
- return (claimed);
-}
-
-int
-qli_scsi_ioctl(struct scsi_link *link, u_long cmd, caddr_t addr, int flag,
- struct proc *p)
-{
- struct qli_softc *sc = (struct qli_softc *)link->adapter_softc;
-
- DNPRINTF(QLI_D_IOCTL, "%s: qli_scsi_ioctl\n", DEVNAME(sc));
-
- if (sc->sc_ioctl)
- return (sc->sc_ioctl(link->adapter_softc, cmd, addr));
- else
- return (ENOTTY);
-}
-
-#if NBIO > 0
-int
-qli_ioctl(struct device *dev, u_long cmd, caddr_t addr)
-{
- struct qli_softc *sc = (struct qli_softc *)dev;
- int error = EINVAL;
-
- DNPRINTF(QLI_D_IOCTL, "%s: qli_ioctl ", DEVNAME(sc));
-
- rw_enter_write(&sc->sc_lock);
-
- switch (cmd) {
- case BIOCINQ:
- DNPRINTF(QLI_D_IOCTL, "inq\n");
- break;
-
- case BIOCVOL:
- DNPRINTF(QLI_D_IOCTL, "vol\n");
- break;
-
- case BIOCDISK:
- DNPRINTF(QLI_D_IOCTL, "disk\n");
- break;
-
- case BIOCALARM:
- DNPRINTF(QLI_D_IOCTL, "alarm\n");
- break;
-
- case BIOCBLINK:
- DNPRINTF(QLI_D_IOCTL, "blink\n");
- break;
-
- case BIOCSETSTATE:
- DNPRINTF(QLI_D_IOCTL, "setstate\n");
- break;
-
- default:
- DNPRINTF(QLI_D_IOCTL, " invalid ioctl\n");
- error = EINVAL;
- }
-
- rw_exit_write(&sc->sc_lock);
-
- return (error);
-}
-#endif /* NBIO > 0 */
-
-#ifndef SMALL_KERNEL
-int
-qli_create_sensors(struct qli_softc *sc)
-{
- return (1);
-}
-#endif /* SMALL_KERNEL */
-
-#ifdef QLI_DEBUG
-void
-qli_dump_mbox(struct qli_softc *sc, u_int32_t *mbox)
-{
- int i;
-
- if ((qli_debug & QLI_D_MBOX) == 0)
- return;
-
- printf("%s: qli_dump_mbox: ", DEVNAME(sc));
- for (i = 0; i < QLI_MBOX_SIZE; i++)
- printf("mbox[%d] = 0x%08x ", i, mbox[i]);
- printf("\n");
-}
-#endif /* QLI_DEBUG */
diff --git a/sys/dev/pci/qlireg.h b/sys/dev/pci/qlireg.h
deleted file mode 100644
index 29d7b0f7c9e..00000000000
--- a/sys/dev/pci/qlireg.h
+++ /dev/null
@@ -1,647 +0,0 @@
-/* $OpenBSD: qlireg.h,v 1.9 2010/10/27 20:48:27 deraadt Exp $ */
-/*
- * Copyright (c) 2007 Marco Peereboom <marco@peereboom.us>
- * Copyright (c) 2007 David Collins <dave@davec.name>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#define QLI_MAXFER (MAXPHYS)
-#define QLI_SOFT_RESET_RETRIES (3)
-
-struct qli_port_regs {
- u_int32_t qpr_ext_hw_conf;
- u_int32_t qpr_chip_config;
- u_int32_t qpr_port_ctrl;
- u_int32_t qpr_port_status;
- u_int32_t qpr_host_prim_mac_hi;
- u_int32_t qpr_host_prim_mac_lo;
- u_int32_t qpr_sec_host_mac_hi;
- u_int32_t qpr_sec_host_mac_lo;
- u_int32_t qpr_ep_prim_mac_hi;
- u_int32_t qpr_ep_prim_mac_lo;
- u_int32_t qpr_ep_sec_mac_hi;
- u_int32_t qpr_ep_sec_mac_lo;
- u_int32_t qpr_host_prim_ip_hi;
- u_int32_t qpr_host_prim_ip_mid_hi;
- u_int32_t qpr_host_prim_ip_mid_lo;
- u_int32_t qpr_host_prim_ip_lo;
- u_int32_t qpr_host_sec_ip_hi;
- u_int32_t qpr_host_sec_ip_mid_hi;
- u_int32_t qpr_host_sec_ip_mid_lo;
- u_int32_t qpr_host_sec_ip_lo;
- u_int32_t qpr_ep_prim_ip_hi;
- u_int32_t qpr_epprimipmidhi;
- u_int32_t qpr_ep_prim_ip_mid_lo;
- u_int32_t qpr_ep_prim_ip_lo;
- u_int32_t qpr_eps_ec_ip_hi;
- u_int32_t qpr_ep_sec_ip_mid_hi;
- u_int32_t qpr_ep_sec_ip_mid_lo;
- u_int32_t qpr_ep_sec_ip_lo;
- u_int32_t qpr_ip_reassembly_timeout;
- u_int32_t qpr_eth_max_frame_payload;
- u_int32_t qpr_tcp_max_window_size;
- u_int32_t qpr_tcp_current_timestamp_hi;
- u_int32_t qpr_tcp_current_timestamp_lo;
- u_int32_t qpr_local_ram_address;
- u_int32_t qpr_local_ram_data;
- u_int32_t qpr_res1;
- u_int32_t qpr_gp_out;
- u_int32_t qpr_gp_in;
- u_int32_t qpr_probe_mux_addr;
- u_int32_t qpr_probe_mux_data;
- u_int32_t qpr_stats_index;
- u_int32_t qpr_stats_read_data_inc;
- u_int32_t qpr_stats_read_data_noinc;
- u_int32_t qpr_port_err_status;
-} __packed;
-
-struct qli_mem_regs {
- u_int32_t qmr_net_request_queue_out;
- u_int32_t qmr_net_request_queue_out_addr_hi;
- u_int32_t qmr_net_request_queue_out_addr_lo;
- u_int32_t qmr_net_request_queue_base_addr_hi;
- u_int32_t qmr_net_request_queue_base_addr_lo;
- u_int32_t qmr_net_request_queue_length;
- u_int32_t qmr_net_response_queue_in;
- u_int32_t qmr_net_response_queue_in_addr_hi;
- u_int32_t qmr_net_response_queue_in_addr_low;
- u_int32_t qmr_net_response_queue_base_addr_hi;
- u_int32_t qmr_net_response_queue_base_addr_lo;
- u_int32_t qmr_net_response_queue_length;
- u_int32_t qmr_req_q_out;
- u_int32_t qmr_request_queue_out_addr_hi;
- u_int32_t qmr_request_queue_out__addr_lo;
- u_int32_t qmr_request_queue_base_addr_hi;
- u_int32_t qmr_request_queue_base_addr_lo;
- u_int32_t qmr_request_queue_length;
- u_int32_t qmr_response_queue_in;
- u_int32_t qmr_response_queue_in_addr_hi;
- u_int32_t qmr_response_queue_in_addr_lo;
- u_int32_t qmr_response_queue_base_addr_hi;
- u_int32_t qmr_response_queue_base_addr_lo;
- u_int32_t qmr_response_queue_length;
- u_int32_t qmr_net_rx_large_buffer_queue_out;
- u_int32_t qmr_net_rx_large_buffer_queue_base_addr_hi;
- u_int32_t qmr_net_rx_large_buffer_queue_base_addr_lo;
- u_int32_t qmr_net_rx_large_buffer_queue_length;
- u_int32_t qmr_net_rx_large_buffer_length;
- u_int32_t qmr_net_rx_small_buffer_queue_out;
- u_int32_t qmr_net_rx_small_buffer_queue_base_addr_hi;
- u_int32_t qmr_net_rx_small_buffer_queue_base_addr_lo;
- u_int32_t qmr_net_rx_small_buffer_queue_length;
- u_int32_t qmr_net_rx_small_buffer_length;
- u_int32_t qmr_res[10];
-} __packed;
-
-struct qli_ram_regs {
- u_int32_t qrr_buflet_size;
- u_int32_t qrr_buflet_max_count;
- u_int32_t qrr_buflet_curr_count;
- u_int32_t qrr_buflet_pause_threshold_count;
- u_int32_t qrr_buflet_tcp_win_threshold_hi;
- u_int32_t qrr_buflet_tcp_win_threshold_lo;
- u_int32_t qrr_ip_hash_table_base_addr;
- u_int32_t qrr_ip_hash_table_size;
- u_int32_t qrr_tcp_hash_table_base_addr;
- u_int32_t qrr_tcp_hash_table_size;
- u_int32_t qrr_ncb_area_base_addr;
- u_int32_t qrr_ncb_max_count;
- u_int32_t qrr_ncb_curr_count;
- u_int32_t qrr_drb_area_base_addr;
- u_int32_t qrr_drb_max_count;
- u_int32_t qrr_drb_curr_count;
- u_int32_t qrr_res[28];
-} __packed;
-
-struct qli_stat_regs{
- u_int32_t qsr_mac_tx_frame_count;
- u_int32_t qsr_mac_tx_byte_count;
- u_int32_t qsr_mac_rx_frame_count;
- u_int32_t qsr_mac_rx_byte_count;
- u_int32_t qsr_mac_crc_err_count;
- u_int32_t qsr_mac_enc_err_count;
- u_int32_t qsr_mac_rx_length_err_count;
- u_int32_t qsr_ip_tx_packet_count;
- u_int32_t qsr_ip_tx_byte_count;
- u_int32_t qsr_ip_tx_fragment_count;
- u_int32_t qsr_ip_rx_packet_count;
- u_int32_t qsr_ip_rx_byte_count;
- u_int32_t qsr_ip_rx_fragment_count;
- u_int32_t qsr_ip_datagram_reassembly_count;
- u_int32_t qsr_ip_v6_rx_packet_count;
- u_int32_t qsr_ip_err_packet_count;
- u_int32_t qsr_ip_reassembly_err_count;
- u_int32_t qsr_tcp_tx_segment_count;
- u_int32_t qsr_tcp_tx_byte_count;
- u_int32_t qsr_tcp_rx_segment_count;
- u_int32_t qsr_tcp_rx_byte_count;
- u_int32_t qsr_tcp_timer_exp_count;
- u_int32_t qsr_tcp_rx_ack_count;
- u_int32_t qsr_tcp_tx_ack_count;
- u_int32_t qsr_tcp_rx_errOOO_count;
- u_int32_t qsr_res0;
- u_int32_t qsr_tcp_rx_window_probe_update_count;
- u_int32_t qsr_ecc_err_correction_count;
- u_int32_t qsr_res1[16];
-} __packed;
-
-#define QLI_MBOX_SIZE 8
-struct qli_reg {
- u_int32_t qlr_mbox[QLI_MBOX_SIZE];
-
- u_int32_t qlr_flash_addr;
- u_int32_t qlr_flash_data;
- u_int32_t qlr_ctrl_status;
-#define QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE (0x1<<2) /* 4010 */
-#define QLI_REG_CTRLSTAT_SCSI_RESET_INTR (0x1<<3)
-#define QLI_REG_CTRLSTAT_SCSI_COMPL_INTR (0x1<<4)
-#define QLI_REG_CTRLSTAT_SCSI_PROC_INTR (0x1<<5)
-#define QLI_REG_CTRLSTAT_EP_INTR (0x1<<6)
-#define QLI_REG_CTRLSTAT_BOOT_ENABLE (0x1<<7)
-#define QLI_REG_CTRLSTAT_FUNC_MASK (0x0700) /* 4022 */
-#define QLI_REG_CTRLSTAT_NET_INTR_ENABLE (0x1<<10) /* 4010 */
-#define QLI_REG_CTRLSTAT_NET_RESET_INTR (0x1<<11) /* 4010 */
-#define QLI_REG_CTRLSTAT_NET_COMPL_INTR (0x1<<12) /* 4010 */
-#define QLI_REG_CTRLSTAT_FORCE_SOFT_RESET (0x1<<13) /* 4022 */
-#define QLI_REG_CTRLSTAT_FATAL_ERROR (0x1<<14)
-#define QLI_REG_CTRLSTAT_SOFT_RESET (0x1<<15)
-
- union {
- struct {
- u_int32_t q10_nvram;
- u_int32_t q10_res[2];
- } __packed isp4010;
- struct {
- u_int32_t q22_intr_mask;
-#define QLI_REG_CTRLSTAT_SCSI_INTR_ENABLE_4022 (0x1<<2) /* 4022 */
- u_int32_t q22_nvram;
- u_int32_t q22_sem;
- } __packed isp4022;
- } u1;
-
-
- u_int32_t qlr_producer;
- u_int32_t qlr_consumer;
-
- u_int32_t qlr_res[2];
- u_int32_t qlr_amc;
- u_int32_t qlr_amd;
-
- union {
- struct {
- u_int32_t q10_ext_hw_conf;
- u_int32_t q10_flow_ctrl;
- u_int32_t q10_port_ctrl;
- u_int32_t q10_port_status;
- u_int32_t q10_res1[8];
- u_int32_t q10_req_q_out;
- u_int32_t q10_res2[23];
- u_int32_t q10_gp_out;
- u_int32_t q10_gp_in;
- u_int32_t q10_probe_mux_addr;
- u_int32_t q10_probe_mux_data;
- u_int32_t q10_res3[3];
- u_int32_t q10_port_err_stat;
- } __packed isp4010;
- struct {
- union {
- struct qli_port_regs q22_pr;
- struct qli_mem_regs q22_mr;
- struct qli_ram_regs q22_rr;
- struct qli_stat_regs q22_sr;
- u_int32_t q22_union[44];
- };
-
- } __packed isp4022;
- } u2;
-} __packed;
-
-#define QLI_PORT_CTRL_INITIALIZED (0x1<<15) /* hw init done */
-#define QLI_PORT_CTRL(s) (s->sc_ql4010 ? \
- &s->sc_reg->u2.isp4010.q10_port_ctrl : \
- &s->sc_reg->u2.isp4022.q22_pr.qpr_port_ctrl)
-
-#define QLI_PORT_STATUS_RESET_INTR (0x1<<3) /* reset interrupt */
-#define QLI_PORT_STATUS(sc) (sc->sc_ql4010 ? \
- &sc->sc_reg->u2.isp4010.q10_port_status : \
- &sc->sc_reg->u2.isp4022.q22_pr.qpr_port_status)
-
-#define QLI_SET_MASK(v) ((v & 0xffff) | (v << 16))
-#define QLI_CLR_MASK(v) (0 | (v << 16))
-
-/* semaphores */
-#define QLI_SEM_MAX_RETRIES (3)
-#define QLI_SEM_4010_SCSI (0x2) /* 4010 */
-
-#define QLI_SEMAPHORE(s) (s->sc_ql4010 ? \
- &s->sc_reg->u1.isp4010.q10_nvram : \
- &s->sc_reg->u1.isp4022.q22_sem)
-
-/* nvram sempahore */
-#define QLI_SEM_4010_NVRAM_SHIFT (12)
-#define QLI_SEM_4022_NVRAM_SHIFT (10)
-#define QLI_SEM_4010_NVRAM_MASK (0x30000000)
-#define QLI_SEM_4022_NVRAM_MASK (0x1c000000)
-#define QLI_SEM_NVRAM(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_NVRAM_SHIFT: \
- QLI_SEM_4022_NVRAM_SHIFT)
-#define QLI_SEM_NVRAM_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_NVRAM_MASK: \
- QLI_SEM_4022_NVRAM_MASK)
-
-/* flash memory sempahore */
-#define QLI_SEM_4010_FLASH_SHIFT (14)
-#define QLI_SEM_4022_FLASH_SHIFT (13)
-#define QLI_SEM_4010_FLASH_MASK (0xc0000000)
-#define QLI_SEM_4022_FLASH_MASK (0xe0000000)
-#define QLI_SEM_FLASH(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_FLASH_SHIFT: \
- QLI_SEM_4022_FLASH_SHIFT)
-#define QLI_SEM_FLASH_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_FLASH_MASK: \
- QLI_SEM_4022_FLASH_MASK)
-
-/* memory semaphore */
-#define QLI_SEM_4010_MEM_SHIFT (8)
-#define QLI_SEM_4022_MEM_SHIFT (4)
-#define QLI_SEM_4010_MEM_MASK (0x03000000)
-#define QLI_SEM_4022_MEM_MASK (0x00700000)
-#define QLI_SEM_MEM(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_MEM_SHIFT: \
- QLI_SEM_4022_MEM_SHIFT)
-#define QLI_SEM_MEM_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_MEM_MASK: \
- QLI_SEM_4022_MEM_MASK)
-
-/* gpio & phy semaphore are the same on the 4022 */
-#define QLI_SEM_4010_PHY_SHIFT (10)
-#define QLI_SEM_4022_PHY_SHIFT (7)
-#define QLI_SEM_4010_PHY_MASK (0x0c000000)
-#define QLI_SEM_4022_PHY_MASK (0x03800000)
-#define QLI_SEM_PHY(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_PHY_SHIFT: \
- QLI_SEM_4022_PHY_SHIFT)
-#define QLI_SEM_PHY_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_PHY_MASK: \
- QLI_SEM_4022_PHY_MASK)
-
-#define QLI_SEM_4010_GPIO_SHIFT (6)
-#define QLI_SEM_4022_GPIO_SHIFT QLI_SEM_4022_PHY_SHIFT
-#define QLI_SEM_4010_GPIO_MASK (0x00c00000)
-#define QLI_SEM_4022_GPIO_MASK QLI_SEM_4022_PHY_MASK
-#define QLI_SEM_GPIO(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_GPIO_SHIFT: \
- QLI_SEM_4022_GPIO_SHIFT)
-#define QLI_SEM_GPIO_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_GPIO_MASK: \
- QLI_SEM_4022_GPIO_MASK)
-
-/* global driver semaphore */
-#define QLI_SEM_4010_DRIVER_SHIFT (4)
-#define QLI_SEM_4022_DRIVER_SHIFT (1)
-#define QLI_SEM_4010_DRIVER_MASK (0x00300000)
-#define QLI_SEM_4022_DRIVER_MASK (0x000e0000)
-#define QLI_SEM_DRIVER(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_DRIVER_SHIFT: \
- QLI_SEM_4022_DRIVER_SHIFT)
-#define QLI_SEM_DRIVER_MASK(s) (s->sc_ql4010 ? \
- QLI_SEM_4010_DRIVER_MASK: \
- QLI_SEM_4022_DRIVER_MASK)
-
-/* mailbox commands */
-#define QLI_MBOX_OPC_ABOUT_FIRMWARE (0x09)
-#define QLI_MBOX_OPC_GET_FW_STATUS (0x1f)
-#define QLI_MBOX_OPC_GET_INITIAL_FW_CB (0x61)
-#define QLI_MBOX_OPC_GET_FW_STATE (0x69)
- /* mbox 1 firmware state */
-#define QLI_MBOX_STATE_READY (0x0<<0)
-#define QLI_MBOX_STATE_CONFIG_WAIT (0x1<<0)
-#define QLI_MBOX_STATE_WAIT_AUTOCONNECT (0x1<<1)
-#define QLI_MBOX_STATE_ERROR (0x1<<2)
-#define QLI_MBOX_STATE_CONFIGURING_IP (0x1<<3)
-#define QLI_MBOX_STATE_WAIT_ACTIVATE_PRI_ACB (0x1<<4)
-#define QLI_MBOX_STATE_WAIT_ACTIVATE_SEC_ACB (0x1<<5)
- /* mbox 2 chip version */
- /* mbox 3 additional state flags */
-#define QLI_MBOX_ASTATE_COPPER_MEDIA (0x0<<0)
-#define QLI_MBOX_ASTATE_OPTICAL_MEDIA (0x1<<0)
-#define QLI_MBOX_ASTATE_DHCPv4_ENABLED (0x1<<1)
-#define QLI_MBOX_ASTATE_DHCPv4_LEASE_ACQUIRED (0x1<<2)
-#define QLI_MBOX_ASTATE_DHCPv4_LEASE_EXPIRED (0x1<<3)
-#define QLI_MBOX_ASTATE_LINK_UP (0x1<<4)
-#define QLI_MBOX_ASTATE_ISNSv4_SVC_ENABLED (0x1<<5)
-#define QLI_MBOX_ASTATE_LINK_SPEED_10MBPS (0x1<<8)
-#define QLI_MBOX_ASTATE_LINK_SPEED_100MBPS (0x1<<9)
-#define QLI_MBOX_ASTATE_LINK_SPEED_1000MBPS (0x1<<10)
-#define QLI_MBOX_ASTATE_HALF_DUPLEX (0x1<<12)
-#define QLI_MBOX_ASTATE_FULL_DUPLEX (0x1<<13)
-#define QLI_MBOX_ASTATE_FLOW_CTRL_ENABLED (0x1<<14)
-#define QLI_MBOX_ASTATE_AUTONEG_ENABLED (0x1<<15)
-#define QLI_MBOX_ASTATE_FW_CTRLS_PORT_LINK (0x1<<16)
-#define QLI_MBOX_ASTATE_PAUSE_TX_ENABLED (0x1<<17)
-#define QLI_MBOX_ASTATE_PAUSE_RX_ENABLED (0x1<<18)
-#define QLI_MBOX_ASTATE_IPV4_PRI_ENABLED (0x1<<19)
-#define QLI_MBOX_ASTATE_IPV4_SEC_ENABLED (0x1<<20)
-#define QLI_MBOX_ASTATE_IPV6_PRI_ENABLED (0x1<<21)
-#define QLI_MBOX_ASTATE_IPV6_SEC_ENABLED (0x1<<22)
-#define QLI_MBOX_ASTATE_DHCPV6_ENABLED (0x1<<23)
-#define QLI_MBOX_ASTATE_IPV6_AUTOCONFIG_ENABLED (0x1<<24)
-#define QLI_MBOX_ASTATE_IPV6_ADDR0_STATE (0x1<<25)
-#define QLI_MBOX_ASTATE_IPV6_ADDR0_EXPIRED (0x1<<26)
-#define QLI_MBOX_ASTATE_IPV6_ADDR1_STATE (0x1<<27)
-#define QLI_MBOX_ASTATE_IPV6_ADDR1_EXPIRED (0x1<<28)
-#define QLI_MBOX_OPC_NOOP (0xFF)
-
-/* mailbox status */
-#define QLI_MBOX_TYPE_SHIFT (12)
-#define QLI_MBOX_COMPLETION_STATUS (4)
-#define QLI_MBOX_STATUS_BUSY (0x0007)
-#define QLI_MBOX_STATUS_INTERMEDIATE_COMPLETION (0x1000)
-#define QLI_MBOX_STATUS_COMMAND_COMPLETE (0x4000)
-#define QLI_MBOX_STATUS_INVALID_COMMAND (0x4001)
-#define QLI_MBOX_STATUS_HOST_INTERFACE_ERROR (0x4002)
-#define QLI_MBOX_STATUS_TEST_FAILED (0x4003)
-#define QLI_MBOX_STATUS_COMMAND_ERROR (0x4005)
-#define QLI_MBOX_STATUS_COMMAND_PARAMETER_ERROR (0x4006)
-#define QLI_MBOX_STATUS_TARGET_MODE_INIT_FAIL (0x4007)
-#define QLI_MBOX_STATUS_INITIATOR_MODE_INIT_FAIL (0x4008)
-
-/* async events */
-#define QLI_MBOX_ASYNC_EVENT_STATUS (8)
-#define QLI_MBOX_AES_SYSTEM_ERROR (0x8002)
-#define QLI_MBOX_AES_REQUEST_TRANSFER_ERROR (0x8003)
-#define QLI_MBOX_AES_RESPONSE_TRANSFER_ERROR (0x8004)
-#define QLI_MBOX_AES_PROTOCOL_STATISTIC_ALARM (0x8005)
-#define QLI_MBOX_AES_SCSI_COMMAND_PDU_REJECTED (0x8006)
-#define QLI_MBOX_AES_LINK_UP (0x8010)
-#define QLI_MBOX_AES_LINK_DOWN (0x8011)
-#define QLI_MBOX_AES_DATABASE_CHANGED (0x8014)
-
-/* external hardware config */
-#define QLI_EXT_HW_CFG(s) (s->sc_ql4010 ? \
- &s->sc_reg->u2.isp4010.q10_ext_hw_conf : \
- &s->sc_reg->u2.isp4022.q22_pr.qpr_ext_hw_conf)
-
-#define QLI_EXT_HW_CFG_DEFAULT_QL4010 (0x1912)
-#define QLI_EXT_HW_CFG_DEFAULT_QL4022 (0x0023)
-
-#define QLI_EXT_HW_CFG_IGNORE_SHRINK_TCP_WINDOW (0x1<<0)
-#define QLI_EXT_HW_CFG_SDRAM_PROTECTION_NONE (0x00)
-#define QLI_EXT_HW_CFG_SDRAM_PROTECTION_BYTE (0x02)
-#define QLI_EXT_HW_CFG_SDRAM_PROTECTION_ECC (0x04)
-#define QLI_EXT_HW_CFG_SDRAM_PROTECTION_ECC2 (0x06)
-#define QLI_EXT_HW_CFG_BANKS (0x1<<3)
-#define QLI_EXT_HW_CFG_CHIP_WIDTH (0x1<<4)
-#define QLI_EXT_HW_CFG_CHIP_SIZE_64M (0x00)
-#define QLI_EXT_HW_CFG_CHIP_SIZE_256M (0x20)
-#define QLI_EXT_HW_CFG_CHIP_SIZE_512M (0x40)
-#define QLI_EXT_HW_CFG_CHIP_SIZE_1G (0x60)
-#define QLI_EXT_HW_CFG_PARITY_DISABLE (0x1<<7)
-#define QLI_EXT_HW_CFG_EXTERNAL_MEM_TYPE (0x1<<8)
-#define QLI_EXT_HW_CFG_FLASH_BIOS_WRT_ENABLE (0x1<<9)
-#define QLI_EXT_HW_CFG_FLASH_UPPER_BANK_SELECT (0x1<<10)
-#define QLI_EXT_HW_CFG_WRITE_BURST_9MA (0x0000)
-#define QLI_EXT_HW_CFG_WRITE_BURST_15MA (0x0800)
-#define QLI_EXT_HW_CFG_WRITE_BURST_18MA (0x1000)
-#define QLI_EXT_HW_CFG_WRITE_BURST_24MA (0x1800)
-#define QLI_EXT_HW_CFG_DDR_DRIVE_STRENGTH_9MA (0x0000)
-#define QLI_EXT_HW_CFG_DDR_DRIVE_STRENGTH_15MA (0x2000)
-#define QLI_EXT_HW_CFG_DDR_DRIVE_STRENGTH_18MA (0x4000)
-#define QLI_EXT_HW_CFG_DDR_DRIVE_STRENGTH_24MA (0x6000)
-
-/* nvram */
-#define QLI_NVRAM_MASK (0xf<<16)
-#define QLI_NVRAM(s) (s->sc_ql4010 ? \
- &s->sc_reg->u1.isp4010.q10_nvram : \
- &s->sc_reg->u1.isp4022.q22_nvram)
-
-#define QLI_NVRAM_CLOCK (0x1<<0)
-#define QLI_NVRAM_SELECT (0x1<<1)
-#define QLI_NVRAM_DATA_OUT (0x1<<2)
-#define QLI_NVRAM_DATA_IN (0x1<<3)
-
-#define QLI_NVRAM_SIZE_4010 (0x100)
-#define QLI_NVRAM_SIZE_4022 (0x400)
-#define QLI_NVRAM_SIZE(s) (s->sc_ql4010 ? \
- QLI_NVRAM_SIZE_4010 : QLI_NVRAM_SIZE_4022)
-
-#define QLI_NVRAM_NUM_CMD_BITS (0x2)
-#define QLI_NVRAM_CMD_READ (0x2)
-
-#define QLI_NVRAM_NUM_ADDR_BITS_4010 (0x8)
-#define QLI_NVRAM_NUM_ADDR_BITS_4022 (0xa)
-#define QLI_NVRAM_NUM_ADDR_BITS(s) (s->sc_ql4010 ? \
- QLI_NVRAM_NUM_ADDR_BITS_4010 : \
- QLI_NVRAM_NUM_ADDR_BITS_4022)
-
-#define QLI_NVRAM_NUM_DATA_BITS (0x10)
-
-#define QLI_NVRAM_EXT_HW_CFG_4010 (0xc)
-#define QLI_NVRAM_EXT_HW_CFG_4022 (0x14)
-#define QLI_NVRAM_EXT_HW_CFG(s) (s->sc_ql4010 ? \
- QLI_NVRAM_EXT_HW_CFG_4010 : \
- QLI_NVRAM_EXT_HW_CFG_4022)
-
-/* firmware control block */
-#define QLI_FW_CTRL_BLK_SIZE (0x400) /* 1k */
-struct qli_cb {
- u_int8_t qcb_version;
-#define QLI_QCB_VER_NO_ADDTIIONAL_INFO (0x00)
-#define QLI_QCB_VER_MIN (0x01)
-#define QLI_QCB_VER_MAX (0x02)
- u_int8_t qcb_ctrl;
-#define QLI_QCB_CTRL_NEW_CONN_DISABLE (0x02)
-#define QLI_QCB_CTRL_SECONDARY_ACB (0x01)
- u_int16_t qcb_fw_options;
-#define QLI_QCB_FWOPT_HEARTBEAT_ENABLE (0x1000)
-#define QLI_QCB_FWOPT_MARKER_DISABLE (0x0400)
-#define QLI_QCB_FWOPT_PROT_STAT_ALARM_DISABLE (0x0200)
-#define QLI_QCB_FWOPT_TARGET_ACCEPT_AEN_ENABLE (0x0100)
-#define QLI_QCB_FWOPT_ACCESS_CTRL_ENABLE (0x0080)
-#define QLI_QCB_FWOPT_SESSION_MODE (0x0040)
-#define QLI_QCB_FWOPT_INITIATOR_MODE (0x0020)
-#define QLI_QCB_FWOPT_TARGET_MODE (0x0010)
-#define QLI_QCB_FWOPT_FAST_POSTING (0x0008)
-#define QLI_QCB_FWOPT_AUTO_TARGET_INFO_DISABLE (0x0004)
-#define QLI_QCB_FWOPT_SENSE_BUFFER_DATA_ENABLE (0x0002)
- u_int16_t qcb_exec_throttle;
- u_int8_t qcb_zio_count;
- u_int8_t qcb_res0;
- u_int16_t qcb_max_eth_payload;
- u_int16_t qcb_add_fw_options;
-#define QLI_QCB_ADDFWOPT_AUTOCONNECT_DISABLE (0x0002)
-#define QLI_QCB_ADDFWOPT_SUSPEND_ON_FW_ERROR (0x0001)
- u_int8_t qcb_heartbeat_intr;
- u_int8_t qcb_instance_nr;
- u_int16_t qcb_res1;
- u_int16_t qcb_req_q_cons_idx; /* 4010 */
- u_int16_t qcb_comp_q_prod_idx; /* 4010 */
- u_int16_t qcb_req_q_len;
- u_int16_t qcb_comp_q_len;
- u_int32_t qcb_req_q_addr_lo;
- u_int32_t qcb_req_q_addr_hi;
- u_int32_t qcb_comp_q_addr_lo;
- u_int32_t qcb_comp_q_addr_hi;
- u_int32_t qcb_shadow_reg_addr_lo;
- u_int32_t qcb_shadow_reg_addr_hi;
- u_int16_t qcb_iscsi_options;
-#define QLI_QCB_ISCSIOPTS_RECV_MARKER_ENABLE (0x8000)
-#define QLI_QCB_ISCSIOPTS_SEND_MARKER_ENABLE (0x4000)
-#define QLI_QCB_ISCSIOPTS_HDR_DIGEST_ENABLE (0x2000)
-#define QLI_QCB_ISCSIOPTS_DATA_DIGEST_ENABLE (0x1000)
-#define QLI_QCB_ISCSIOPTS_IMMEDIATE_DATA_ENABLE (0x0800)
-#define QLI_QCB_ISCSIOPTS_INITIAL_R2T_ENABLE (0x0400)
-#define QLI_QCB_ISCSIOPTS_DATA_SEQ_IN_ORDER (0x0200)
-#define QLI_QCB_ISCSIOPTS_DATA_PDU_IN_ORDER (0x0100)
-#define QLI_QCB_ISCSIOPTS_CHAP_AUTH_ENABLE (0x0080)
-#define QLI_QCB_ISCSIOPTS_SNACK_REQ_ENABLE (0x0040)
-#define QLI_QCB_ISCSIOPTS_DISCOVERY_LOGOUT_ENABLE (0x0020)
-#define QLI_QCB_ISCSIOPTS_BIDIR_CHAP_ENABLE (0x0010)
- u_int16_t qcb_tcp_options;
-#define QLI_QCB_TCPOPTS_ISNS_ENABLE (0x4000)
-#define QLI_QCB_TCPOPTS_SLP_USE_DA_ENABLE (0x2000)
-#define QLI_QCB_TCPOPTS_AUTO_DISCOVERY_ENABLE (0x1000)
-#define QLI_QCB_TCPOPTS_SLP_UA_ENABLE (0x0800)
-#define QLI_QCB_TCPOPTS_SLP_SA_ENABLE (0x0400)
-#define QLI_QCB_TCPOPTS_DHCP_ENABLE (0x0200)
-#define QLI_QCB_TCPOPTS_GET_DNS_VIA_DHCP_ENABLE (0x0100)
-#define QLI_QCB_TCPOPTS_GET_SLP_VIA_DHCP_ENABLE (0x0080)
-#define QLI_QCB_TCPOPTS_LEARN_ISNS_IPADDR_ENABLE (0x0040)
-#define QLI_QCB_TCPOPTS_NAGLE_DISABLE (0x0020)
-#define QLI_QCB_TCPOPTS_TIMER_SCALE_MASK (0x000e)
-#define QLI_QCB_TCPOPTS_TIME_STAMP_ENABLE (0x0001)
- u_int16_t qcb_ip_options;
-#define QLI_QCB_IPOPTS_IPV4_ENABLE (0x8000)
-#define QLI_QCB_IPOPTS_IPV4_TOS_ENABLE (0x4000)
-#define QLI_QCB_IPOPTS_VLAN_TAGGING_ENABLE (0x2000)
-#define QLI_QCB_IPOPTS_GRAT_ARP_ENABLE (0x1000)
-#define QLI_QCB_IPOPTS_DHCP_USE_ALT_CLIENT_ID (0x0800)
-#define QLI_QCB_IPOPTS_DHCP_REQUIRE_VENDOR_ID (0x0400)
-#define QLI_QCB_IPOPTS_DHCP_USE_VENDOR_ID (0x0200)
-#define QLI_QCB_IPOPTS_LEARN_IQN (0x0100)
-#define QLI_QCB_IPOPTS_FRAG_DISABLE (0x0010)
-#define QLI_QCB_IPOPTS_INCOMMING_FORWARDING_ENABLE (0x0008)
-#define QLI_QCB_IPOPTS_ARP_REDIRECT_ENABLE (0x0004)
-#define QLI_QCB_IPOPTS_PAUSE_FRAME_ENABLE (0x0002)
-#define QLI_QCB_IPOPTS_IPADDR_VALID (0x0001)
- u_int16_t qcb_max_pdu_size;
- u_int8_t qcb_tos;
- u_int8_t qcb_ttl;
- u_int8_t qcb_acb_version;
-#define QLI_QCB_ACBVER_NOT_SUPPORTED (0x00)
-#define QLI_QCB_ACBVER_SUPPORTED (0x02)
- u_int8_t qcb_res2;
- u_int16_t qcb_def_timeout;
- u_int16_t qcb_first_burst_size;
- u_int16_t qcb_def_time_to_wait;
- u_int16_t qcb_def_time_to_retain;
- u_int16_t qcb_max_out_r2t;
- u_int16_t qcb_keep_alive_timeout;
- u_int16_t qcb_port;
- u_int16_t max_burst_size;
- u_int32_t qcb_res3;
- u_int32_t qcb_ip_addr;
- u_int16_t qcb_vlan_tag_ctrl;
- u_int8_t qcb_ip_addr_state;
- u_int8_t qcb_ip_cache_id;
- u_int8_t qcb_res4[8];
- u_int32_t qcb_subnet_mask;
- u_int8_t qcb_res5[12];
- u_int32_t qcb_gateway_addr;
- u_int8_t qcb_res6[12];
- u_int32_t qcb_pri_dns_addr;
- u_int32_t qcb_sec_dns_addr;
- u_int16_t qcb_min_eport;
- u_int16_t qcb_max_eport;
- u_int8_t qcb_res7[4];
- u_int8_t qcb_iscsi_alias[32];
- u_int8_t qcb_res8[24];
- u_int8_t qcb_abort_timer;
- u_int8_t qcb_tcp_win_scale_factor;
- u_int8_t qcb_res9[10];
- u_int8_t qcb_dhcp_vendor_id_len;
- u_int8_t qcb_dhcp_vendor_id[11];
- u_int32_t qcb_isns_addr;
- u_int16_t qcb_isns_port;
- u_int8_t qcb_res10[14];
- u_int8_t qcb_dhcp_client_id_len;
- u_int8_t qcb_dhcp_client_id[11];
- u_int8_t qcb_iscsi_name[224];
- u_int8_t qcb_res11[32];
- u_int32_t qcb_cookie;
-#define QLI_QCB_COOKIE (0x11bead5a)
- /* ip v6 section */
- u_int16_t qcb_ipv6_port;
- u_int16_t qcb_ipv6_options;
-#define QLI_QCB_IPV6OPTS_IPV6_ENABLE (0x8000)
-#define QLI_QCB_IPV6OPTS_VLAN_TAGGING_ENABLE (0x2000)
-#define QLI_QCB_IPV6OPTS_GRAT_NEIGHBOR_ENABLE (0x1000)
-#define QLI_QCB_IPV6OPTS_INBOUND_FORW_ENABLE (0x0008)
- u_int16_t qcb_ipv6_add_options;
-#define QLI_QCB_IPV6AOPTS_NEIGHB_DISC_ENABLE (0x0002)
-#define QLI_QCB_IPV6AOPTS_AUTOCFG_LINK_ENABLE (0x0001)
- u_int16_t qcb_ipv6_tcp_options;
-#define QLI_QCB_IPV6TCPOPTS_DELAYED_ACK_DISABLE (0x8000)
-#define QLI_QCB_IPV6TCPOPTS_ISNS_ENABLE (0x4000)
-#define QLI_QCB_IPV6TCPOPTS_TCP_WINDOW_SCALE (0x0400)
-#define QLI_QCB_IPV6TCPOPTS_NAGLE_DISABLE (0x0020)
-#define QLI_QCB_IPV6TCPOPTS_TCP_WIN_SCALE_DISA (0x0010)
-#define QLI_QCB_IPV6TCPOPTS_TIMER_SCALE_MASK (0x000e)
-#define QLI_QCB_IPV6TCPOPTS_TIME_STAMP_ENABLE (0x0001)
- u_int8_t qcb_ipv6_tcp_recv_scale;
- u_int8_t qcb_ipv6_flow_label[3];
- u_int8_t qcb_ipv6_def_router_addr[16];
- u_int8_t qcb_ipv6_vlan_tci[2];
- u_int8_t qcb_ipv6_link_local_addr_state;
-#define QLI_QCB_IPV6_LLAS_UNCONFIGURED (0x00)
-#define QLI_QCB_IPV6_LLAS_INVALID (0x01)
-#define QLI_QCB_IPV6_LLAS_ACQUIRING (0x02)
-#define QLI_QCB_IPV6_LLAS_TENTATIVE (0x03)
-#define QLI_QCB_IPV6_LLAS_DEPRECATED (0x04)
-#define QLI_QCB_IPV6_LLAS_PREFERRED (0x05)
-#define QLI_QCB_IPV6_LLAS_DISABLING (0x06)
- u_int8_t qcb_ipv6_addr0_state;
- u_int8_t qcb_ipv6_addr1_state;
- u_int8_t qcb_ipv6_def_router_state;
- u_int8_t qcb_ipv6_traf_class;
- u_int8_t qcb_ipv6_hop_limit;
- u_int8_t qcb_ipv6_iface_id[8];
- u_int8_t qcb_ipv6_addr0[16];
- u_int8_t qcb_ipv6_addr1[16];
- u_int32_t qcb_ipv6_nd_reachable_time;
- u_int32_t qcb_ipv6_nd_retransmit_timer;
- u_int32_t qcb_ipv6_nd_stale_timeout;
- u_int8_t qcb_ipv6_dup_addr_count;
- u_int8_t qcb_ipv6_cache_id;
- u_int8_t qcb_ipv6_res0[2];
- u_int8_t qcb_ipv6_isns_addr1[16];
- u_int8_t qcb_ipv6_router_ad_lnk_mtu[4];
- u_int8_t qcb_ipv6_res1[140];
-} __packed;
-
-/* queues */
-#define QLI_REQUESTQ_DEPTH (1024)
-#define QLI_QUEUE_SIZE (64)
-#define QLI_RESPONSEQ_DEPTH (64)
-
-struct qli_queue_entry {
- u_int8_t qqe_data[60];
- u_int32_t qqe_signature;
-} __packed;
-
-/* shadow regs */
-struct qli_shadow_regs {
- u_int32_t qsr_req_q;
- u_int32_t qsr_resp_q;
-} __packed;