- Remove a redundant variable in mpt_pci_attach().
- #if 0 the currently unused paired port linking and unlinking of dual adapters. - Simplify MSI/MSI-X allocation and release. For a single one, we don't need to fiddle with the MSI/MSI-X count and pci_release_msi(9) is smart enough to just do nothing in case of INTx. - Canonicalize actions taken on attach failure and detach. - Remove the remainder of incomplete support for older FreeBSD versions. MFC after: 1 week
This commit is contained in:
parent
6a5519caca
commit
a6fa8f7ccf
@ -220,9 +220,6 @@ int mpt_modevent(module_t, int, void *);
|
||||
#define bus_dmamap_sync_range(dma_tag, dmamap, offset, len, op) \
|
||||
bus_dmamap_sync(dma_tag, dmamap, op)
|
||||
|
||||
#if __FreeBSD_version < 600000
|
||||
#define bus_get_dma_tag(x) NULL
|
||||
#endif
|
||||
#define mpt_dma_tag_create(mpt, parent_tag, alignment, boundary, \
|
||||
lowaddr, highaddr, filter, filterarg, \
|
||||
maxsize, nsegments, maxsegsz, flags, \
|
||||
@ -239,34 +236,6 @@ struct mpt_map_info {
|
||||
};
|
||||
|
||||
void mpt_map_rquest(void *, bus_dma_segment_t *, int, int);
|
||||
/* **************************** NewBUS interrupt Crock ************************/
|
||||
#if __FreeBSD_version < 700031
|
||||
#define mpt_setup_intr(d, i, f, U, if, ifa, hp) \
|
||||
bus_setup_intr(d, i, f, if, ifa, hp)
|
||||
#else
|
||||
#define mpt_setup_intr bus_setup_intr
|
||||
#endif
|
||||
|
||||
/* **************************** NewBUS CAM Support ****************************/
|
||||
#if __FreeBSD_version < 700049
|
||||
#define mpt_xpt_bus_register(sim, parent, bus) \
|
||||
xpt_bus_register(sim, bus)
|
||||
#else
|
||||
#define mpt_xpt_bus_register xpt_bus_register
|
||||
#endif
|
||||
|
||||
/**************************** Kernel Thread Support ***************************/
|
||||
#if __FreeBSD_version > 800001
|
||||
#define mpt_kthread_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg) \
|
||||
kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg)
|
||||
#define mpt_kthread_exit(status) \
|
||||
kproc_exit(status)
|
||||
#else
|
||||
#define mpt_kthread_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg) \
|
||||
kthread_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg)
|
||||
#define mpt_kthread_exit(status) \
|
||||
kthread_exit(status)
|
||||
#endif
|
||||
|
||||
/********************************** Endianess *********************************/
|
||||
#define MPT_2_HOST64(ptr, tag) ptr->tag = le64toh(ptr->tag)
|
||||
@ -671,7 +640,6 @@ struct mpt_softc {
|
||||
/*
|
||||
* PCI Hardware info
|
||||
*/
|
||||
int pci_msi_count;
|
||||
struct resource * pci_irq; /* Interrupt map for chip */
|
||||
void * ih; /* Interrupt handle */
|
||||
#if 0
|
||||
@ -754,9 +722,10 @@ struct mpt_softc {
|
||||
uint16_t sequence; /* Sequence Number */
|
||||
uint16_t pad3;
|
||||
|
||||
|
||||
#if 0
|
||||
/* Paired port in some dual adapters configurations */
|
||||
struct mpt_softc * mpt2;
|
||||
#endif
|
||||
|
||||
/* FW Image management */
|
||||
uint32_t fw_image_size;
|
||||
|
@ -110,12 +110,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/kthread.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#if __FreeBSD_version >= 700025
|
||||
#ifndef CAM_NEW_TRAN_CODE
|
||||
#define CAM_NEW_TRAN_CODE 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void mpt_poll(struct cam_sim *);
|
||||
static timeout_t mpt_timeout;
|
||||
static void mpt_action(struct cam_sim *, union ccb *);
|
||||
@ -344,7 +338,7 @@ mpt_cam_attach(struct mpt_softc *mpt)
|
||||
* Register exactly this bus.
|
||||
*/
|
||||
MPT_LOCK(mpt);
|
||||
if (mpt_xpt_bus_register(mpt->sim, mpt->dev, 0) != CAM_SUCCESS) {
|
||||
if (xpt_bus_register(mpt->sim, mpt->dev, 0) != CAM_SUCCESS) {
|
||||
mpt_prt(mpt, "Bus registration Failed!\n");
|
||||
error = ENOMEM;
|
||||
MPT_UNLOCK(mpt);
|
||||
@ -383,7 +377,7 @@ mpt_cam_attach(struct mpt_softc *mpt)
|
||||
* Register this bus.
|
||||
*/
|
||||
MPT_LOCK(mpt);
|
||||
if (mpt_xpt_bus_register(mpt->phydisk_sim, mpt->dev, 1) !=
|
||||
if (xpt_bus_register(mpt->phydisk_sim, mpt->dev, 1) !=
|
||||
CAM_SUCCESS) {
|
||||
mpt_prt(mpt, "Physical Disk Bus registration Failed!\n");
|
||||
error = ENOMEM;
|
||||
@ -2338,7 +2332,6 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req,
|
||||
break;
|
||||
|
||||
case MPI_EVENT_RESCAN:
|
||||
#if __FreeBSD_version >= 600000
|
||||
{
|
||||
union ccb *ccb;
|
||||
uint32_t pathid;
|
||||
@ -2373,10 +2366,7 @@ mpt_cam_event(struct mpt_softc *mpt, request_t *req,
|
||||
xpt_rescan(ccb);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
mpt_prt(mpt, "Rescan Port: %d\n", (data0 >> 8) & 0xff);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case MPI_EVENT_LINK_STATUS_CHANGE:
|
||||
mpt_prt(mpt, "Port %d: LinkState: %s\n",
|
||||
(data1 >> 8) & 0xff,
|
||||
@ -3324,11 +3314,8 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
#define IS_CURRENT_SETTINGS(c) ((c)->type == CTS_TYPE_CURRENT_SETTINGS)
|
||||
#else
|
||||
#define IS_CURRENT_SETTINGS(c) ((c)->flags & CCB_TRANS_CURRENT_SETTINGS)
|
||||
#endif
|
||||
|
||||
#define DP_DISC_ENABLE 0x1
|
||||
#define DP_DISC_DISABL 0x2
|
||||
#define DP_DISC (DP_DISC_ENABLE|DP_DISC_DISABL)
|
||||
@ -3345,10 +3332,8 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
|
||||
case XPT_SET_TRAN_SETTINGS: /* Nexus Settings */
|
||||
{
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
struct ccb_trans_settings_scsi *scsi;
|
||||
struct ccb_trans_settings_spi *spi;
|
||||
#endif
|
||||
uint8_t dval;
|
||||
u_int period;
|
||||
u_int offset;
|
||||
@ -3361,7 +3346,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
scsi = &cts->proto_specific.scsi;
|
||||
spi = &cts->xport_specific.spi;
|
||||
|
||||
@ -3372,7 +3356,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Skip attempting settings on RAID volume disks.
|
||||
@ -3402,28 +3385,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
period = 0;
|
||||
offset = 0;
|
||||
|
||||
#ifndef CAM_NEW_TRAN_CODE
|
||||
if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
|
||||
dval |= (cts->flags & CCB_TRANS_DISC_ENB) ?
|
||||
DP_DISC_ENABLE : DP_DISC_DISABL;
|
||||
}
|
||||
|
||||
if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
|
||||
dval |= (cts->flags & CCB_TRANS_TAG_ENB) ?
|
||||
DP_TQING_ENABLE : DP_TQING_DISABL;
|
||||
}
|
||||
|
||||
if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) {
|
||||
dval |= cts->bus_width ? DP_WIDE : DP_NARROW;
|
||||
}
|
||||
|
||||
if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) &&
|
||||
(cts->valid & CCB_TRANS_SYNC_OFFSET_VALID)) {
|
||||
dval |= DP_SYNC;
|
||||
period = cts->sync_period;
|
||||
offset = cts->sync_offset;
|
||||
}
|
||||
#else
|
||||
if ((spi->valid & CTS_SPI_VALID_DISC) != 0) {
|
||||
dval |= ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) != 0) ?
|
||||
DP_DISC_ENABLE : DP_DISC_DISABL;
|
||||
@ -3459,7 +3420,7 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
period &= MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK;
|
||||
period >>= MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (dval & DP_DISC_ENABLE) {
|
||||
mpt->mpt_disc_enable |= (1 << tgt);
|
||||
} else if (dval & DP_DISC_DISABL) {
|
||||
@ -3492,7 +3453,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
}
|
||||
case XPT_GET_TRAN_SETTINGS:
|
||||
{
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
struct ccb_trans_settings_scsi *scsi;
|
||||
cts = &ccb->cts;
|
||||
cts->protocol = PROTO_SCSI;
|
||||
@ -3524,21 +3484,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
scsi = &cts->proto_specific.scsi;
|
||||
scsi->valid = CTS_SCSI_VALID_TQ;
|
||||
scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
|
||||
#else
|
||||
cts = &ccb->cts;
|
||||
if (mpt->is_fc) {
|
||||
cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
|
||||
cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
|
||||
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
|
||||
} else if (mpt->is_sas) {
|
||||
cts->flags = CCB_TRANS_TAG_ENB | CCB_TRANS_DISC_ENB;
|
||||
cts->valid = CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
|
||||
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
|
||||
} else if (mpt_get_spi_settings(mpt, cts) != 0) {
|
||||
mpt_set_ccb_status(ccb, CAM_REQ_CMP_ERR);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
mpt_set_ccb_status(ccb, CAM_REQ_CMP);
|
||||
break;
|
||||
}
|
||||
@ -3592,7 +3537,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
/*
|
||||
* The base speed is the speed of the underlying connection.
|
||||
*/
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
cpi->protocol = PROTO_SCSI;
|
||||
if (mpt->is_fc) {
|
||||
cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED;
|
||||
@ -3616,21 +3560,6 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
cpi->transport_version = 2;
|
||||
cpi->protocol_version = SCSI_REV_2;
|
||||
}
|
||||
#else
|
||||
if (mpt->is_fc) {
|
||||
cpi->hba_misc = PIM_NOBUSRESET;
|
||||
cpi->base_transfer_speed = 100000;
|
||||
cpi->hba_inquiry = PI_TAG_ABLE;
|
||||
} else if (mpt->is_sas) {
|
||||
cpi->hba_misc = PIM_NOBUSRESET;
|
||||
cpi->base_transfer_speed = 300000;
|
||||
cpi->hba_inquiry = PI_TAG_ABLE;
|
||||
} else {
|
||||
cpi->hba_misc = PIM_SEQSCAN;
|
||||
cpi->base_transfer_speed = 3300;
|
||||
cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We give our fake RAID passhtru bus a width that is MaxVolumes
|
||||
@ -3726,10 +3655,8 @@ mpt_action(struct cam_sim *sim, union ccb *ccb)
|
||||
static int
|
||||
mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
|
||||
{
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
struct ccb_trans_settings_scsi *scsi = &cts->proto_specific.scsi;
|
||||
struct ccb_trans_settings_spi *spi = &cts->xport_specific.spi;
|
||||
#endif
|
||||
target_id_t tgt;
|
||||
uint32_t dval, pval, oval;
|
||||
int rv;
|
||||
@ -3790,29 +3717,6 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
|
||||
pval = MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(pval);
|
||||
}
|
||||
|
||||
#ifndef CAM_NEW_TRAN_CODE
|
||||
cts->flags &= ~(CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB);
|
||||
cts->valid = 0;
|
||||
cts->sync_period = pval;
|
||||
cts->sync_offset = oval;
|
||||
cts->valid |= CCB_TRANS_SYNC_RATE_VALID;
|
||||
cts->valid |= CCB_TRANS_SYNC_OFFSET_VALID;
|
||||
cts->valid |= CCB_TRANS_BUS_WIDTH_VALID;
|
||||
if (dval & DP_WIDE) {
|
||||
cts->bus_width = MSG_EXT_WDTR_BUS_16_BIT;
|
||||
} else {
|
||||
cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
|
||||
}
|
||||
if (cts->ccb_h.target_lun != CAM_LUN_WILDCARD) {
|
||||
cts->valid |= CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
|
||||
if (dval & DP_DISC_ENABLE) {
|
||||
cts->flags |= CCB_TRANS_DISC_ENB;
|
||||
}
|
||||
if (dval & DP_TQING_ENABLE) {
|
||||
cts->flags |= CCB_TRANS_TAG_ENB;
|
||||
}
|
||||
}
|
||||
#else
|
||||
spi->valid = 0;
|
||||
scsi->valid = 0;
|
||||
spi->flags = 0;
|
||||
@ -3837,10 +3741,10 @@ mpt_get_spi_settings(struct mpt_softc *mpt, struct ccb_trans_settings *cts)
|
||||
spi->flags |= CTS_SPI_FLAGS_DISC_ENB;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
|
||||
"mpt_get_spi_settings[%d]: %s flags 0x%x per 0x%x off=%d\n", tgt,
|
||||
IS_CURRENT_SETTINGS(cts)? "ACTIVE" : "NVRAM ", dval, pval, oval);
|
||||
IS_CURRENT_SETTINGS(cts) ? "ACTIVE" : "NVRAM ", dval, pval, oval);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -3910,7 +3814,7 @@ mpt_spawn_recovery_thread(struct mpt_softc *mpt)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = mpt_kthread_create(mpt_recovery_thread, mpt,
|
||||
error = kproc_create(mpt_recovery_thread, mpt,
|
||||
&mpt->recovery_thread, /*flags*/0,
|
||||
/*altstack*/0, "mpt_recovery%d", mpt->unit);
|
||||
return (error);
|
||||
@ -3953,7 +3857,7 @@ mpt_recovery_thread(void *arg)
|
||||
mpt->recovery_thread = NULL;
|
||||
wakeup(&mpt->recovery_thread);
|
||||
MPT_UNLOCK(mpt);
|
||||
mpt_kthread_exit(0);
|
||||
kproc_exit(0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -105,14 +105,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/mpt/mpt_cam.h>
|
||||
#include <dev/mpt/mpt_raid.h>
|
||||
|
||||
#if __FreeBSD_version < 700000
|
||||
#define pci_msix_count(x) 0
|
||||
#define pci_msi_count(x) 0
|
||||
#define pci_alloc_msi(x, y) 1
|
||||
#define pci_alloc_msix(x, y) 1
|
||||
#define pci_release_msi(x) do { ; } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* XXX it seems no other MPT driver knows about the following chips.
|
||||
*/
|
||||
@ -149,10 +141,6 @@ __FBSDID("$FreeBSD$");
|
||||
#define MPI_MANUFACTPAGE_DEVID_SAS1078DE_FB 0x007C
|
||||
#endif
|
||||
|
||||
#ifndef PCIM_CMD_SERRESPEN
|
||||
#define PCIM_CMD_SERRESPEN 0x0100
|
||||
#endif
|
||||
|
||||
static int mpt_pci_probe(device_t);
|
||||
static int mpt_pci_attach(device_t);
|
||||
static void mpt_free_bus_resources(struct mpt_softc *mpt);
|
||||
@ -178,6 +166,7 @@ static device_method_t mpt_methods[] = {
|
||||
static driver_t mpt_driver = {
|
||||
"mpt", mpt_methods, sizeof(struct mpt_softc)
|
||||
};
|
||||
|
||||
static devclass_t mpt_devclass;
|
||||
DRIVER_MODULE(mpt, pci, mpt_driver, mpt_devclass, NULL, NULL);
|
||||
MODULE_DEPEND(mpt, pci, 1, 1, 1);
|
||||
@ -288,6 +277,7 @@ mpt_set_options(struct mpt_softc *mpt)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
mpt_link_peer(struct mpt_softc *mpt)
|
||||
{
|
||||
@ -326,13 +316,14 @@ mpt_unlink_peer(struct mpt_softc *mpt)
|
||||
mpt->mpt2->mpt2 = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
mpt_pci_attach(device_t dev)
|
||||
{
|
||||
struct mpt_softc *mpt;
|
||||
int iqd;
|
||||
uint32_t data, cmd;
|
||||
uint32_t val;
|
||||
int mpt_io_bar, mpt_mem_bar;
|
||||
|
||||
mpt = (struct mpt_softc*)device_get_softc(dev);
|
||||
@ -393,19 +384,19 @@ mpt_pci_attach(device_t dev)
|
||||
/*
|
||||
* Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER are set.
|
||||
*/
|
||||
cmd = pci_read_config(dev, PCIR_COMMAND, 2);
|
||||
cmd |=
|
||||
PCIM_CMD_SERRESPEN | PCIM_CMD_PERRESPEN |
|
||||
val = pci_read_config(dev, PCIR_COMMAND, 2);
|
||||
val |= PCIM_CMD_SERRESPEN | PCIM_CMD_PERRESPEN |
|
||||
PCIM_CMD_BUSMASTEREN | PCIM_CMD_MWRICEN;
|
||||
pci_write_config(dev, PCIR_COMMAND, cmd, 2);
|
||||
pci_write_config(dev, PCIR_COMMAND, val, 2);
|
||||
|
||||
/*
|
||||
* Make sure we've disabled the ROM.
|
||||
*/
|
||||
data = pci_read_config(dev, PCIR_BIOS, 4);
|
||||
data &= ~PCIM_BIOS_ENABLE;
|
||||
pci_write_config(dev, PCIR_BIOS, data, 4);
|
||||
val = pci_read_config(dev, PCIR_BIOS, 4);
|
||||
val &= ~PCIM_BIOS_ENABLE;
|
||||
pci_write_config(dev, PCIR_BIOS, val, 4);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Is this part a dual?
|
||||
* If so, link with our partner (around yet)
|
||||
@ -422,12 +413,13 @@ mpt_pci_attach(device_t dev)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Figure out which are the I/O and MEM Bars
|
||||
*/
|
||||
data = pci_read_config(dev, PCIR_BAR(0), 4);
|
||||
if (PCI_BAR_IO(data)) {
|
||||
val = pci_read_config(dev, PCIR_BAR(0), 4);
|
||||
if (PCI_BAR_IO(val)) {
|
||||
/* BAR0 is IO, BAR1 is memory */
|
||||
mpt_io_bar = 0;
|
||||
mpt_mem_bar = 1;
|
||||
@ -484,25 +476,15 @@ mpt_pci_attach(device_t dev)
|
||||
* First try to alloc an MSI-X message. If that
|
||||
* fails, then try to alloc an MSI message instead.
|
||||
*/
|
||||
if (pci_msix_count(dev) == 1) {
|
||||
mpt->pci_msi_count = 1;
|
||||
if (pci_alloc_msix(dev, &mpt->pci_msi_count) == 0) {
|
||||
iqd = 1;
|
||||
} else {
|
||||
mpt->pci_msi_count = 0;
|
||||
}
|
||||
}
|
||||
if (iqd == 0 && pci_msi_count(dev) == 1) {
|
||||
mpt->pci_msi_count = 1;
|
||||
if (pci_alloc_msi(dev, &mpt->pci_msi_count) == 0) {
|
||||
iqd = 1;
|
||||
} else {
|
||||
mpt->pci_msi_count = 0;
|
||||
}
|
||||
}
|
||||
val = 1;
|
||||
if (pci_alloc_msix(dev, &val) == 0)
|
||||
iqd = 1;
|
||||
val = 1;
|
||||
if (iqd == 0 && pci_alloc_msi(dev, &val) == 0)
|
||||
iqd = 1;
|
||||
}
|
||||
mpt->pci_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd,
|
||||
RF_ACTIVE | (mpt->pci_msi_count ? 0 : RF_SHAREABLE));
|
||||
RF_ACTIVE | (iqd != 0 ? 0 : RF_SHAREABLE));
|
||||
if (mpt->pci_irq == NULL) {
|
||||
device_printf(dev, "could not allocate interrupt\n");
|
||||
goto bad;
|
||||
@ -514,7 +496,7 @@ mpt_pci_attach(device_t dev)
|
||||
mpt_disable_ints(mpt);
|
||||
|
||||
/* Register the interrupt handler */
|
||||
if (mpt_setup_intr(dev, mpt->pci_irq, MPT_IFLAGS, NULL, mpt_pci_intr,
|
||||
if (bus_setup_intr(dev, mpt->pci_irq, MPT_IFLAGS, NULL, mpt_pci_intr,
|
||||
mpt, &mpt->ih)) {
|
||||
device_printf(dev, "could not setup interrupt\n");
|
||||
goto bad;
|
||||
@ -562,7 +544,10 @@ mpt_pci_attach(device_t dev)
|
||||
|
||||
if (mpt->eh == NULL) {
|
||||
mpt_prt(mpt, "shutdown event registration failed\n");
|
||||
mpt_disable_ints(mpt);
|
||||
(void) mpt_detach(mpt);
|
||||
mpt_reset(mpt, /*reinit*/FALSE);
|
||||
mpt_raid_free_mem(mpt);
|
||||
goto bad;
|
||||
}
|
||||
return (0);
|
||||
@ -570,7 +555,9 @@ mpt_pci_attach(device_t dev)
|
||||
bad:
|
||||
mpt_dma_mem_free(mpt);
|
||||
mpt_free_bus_resources(mpt);
|
||||
#if 0
|
||||
mpt_unlink_peer(mpt);
|
||||
#endif
|
||||
|
||||
MPT_LOCK_DESTROY(mpt);
|
||||
|
||||
@ -595,25 +582,21 @@ mpt_free_bus_resources(struct mpt_softc *mpt)
|
||||
if (mpt->pci_irq) {
|
||||
bus_release_resource(mpt->dev, SYS_RES_IRQ,
|
||||
rman_get_rid(mpt->pci_irq), mpt->pci_irq);
|
||||
pci_release_msi(mpt->dev);
|
||||
mpt->pci_irq = NULL;
|
||||
}
|
||||
|
||||
if (mpt->pci_msi_count) {
|
||||
pci_release_msi(mpt->dev);
|
||||
mpt->pci_msi_count = 0;
|
||||
}
|
||||
|
||||
if (mpt->pci_pio_reg) {
|
||||
bus_release_resource(mpt->dev, SYS_RES_IOPORT,
|
||||
rman_get_rid(mpt->pci_pio_reg), mpt->pci_pio_reg);
|
||||
mpt->pci_pio_reg = NULL;
|
||||
}
|
||||
|
||||
if (mpt->pci_reg) {
|
||||
bus_release_resource(mpt->dev, SYS_RES_MEMORY,
|
||||
rman_get_rid(mpt->pci_reg), mpt->pci_reg);
|
||||
mpt->pci_reg = NULL;
|
||||
}
|
||||
MPT_LOCK_DESTROY(mpt);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -630,12 +613,16 @@ mpt_pci_detach(device_t dev)
|
||||
mpt_disable_ints(mpt);
|
||||
mpt_detach(mpt);
|
||||
mpt_reset(mpt, /*reinit*/FALSE);
|
||||
mpt_raid_free_mem(mpt);
|
||||
mpt_dma_mem_free(mpt);
|
||||
mpt_free_bus_resources(mpt);
|
||||
mpt_raid_free_mem(mpt);
|
||||
#if 0
|
||||
mpt_unlink_peer(mpt);
|
||||
#endif
|
||||
if (mpt->eh != NULL) {
|
||||
EVENTHANDLER_DEREGISTER(shutdown_post_sync, mpt->eh);
|
||||
}
|
||||
MPT_LOCK_DESTROY(mpt);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
@ -649,11 +636,8 @@ mpt_pci_shutdown(device_t dev)
|
||||
struct mpt_softc *mpt;
|
||||
|
||||
mpt = (struct mpt_softc *)device_get_softc(dev);
|
||||
if (mpt) {
|
||||
int r;
|
||||
r = mpt_shutdown(mpt);
|
||||
return (r);
|
||||
}
|
||||
if (mpt)
|
||||
return (mpt_shutdown(mpt));
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -669,20 +653,11 @@ mpt_dma_mem_alloc(struct mpt_softc *mpt)
|
||||
}
|
||||
|
||||
len = sizeof (request_t) * MPT_MAX_REQUESTS(mpt);
|
||||
#ifdef RELENG_4
|
||||
mpt->request_pool = (request_t *)malloc(len, M_DEVBUF, M_WAITOK);
|
||||
if (mpt->request_pool == NULL) {
|
||||
mpt_prt(mpt, "cannot allocate request pool\n");
|
||||
return (1);
|
||||
}
|
||||
memset(mpt->request_pool, 0, len);
|
||||
#else
|
||||
mpt->request_pool = (request_t *)malloc(len, M_DEVBUF, M_WAITOK|M_ZERO);
|
||||
if (mpt->request_pool == NULL) {
|
||||
mpt_prt(mpt, "cannot allocate request pool\n");
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Create a parent dma tag for this device.
|
||||
|
@ -636,7 +636,7 @@ mpt_spawn_raid_thread(struct mpt_softc *mpt)
|
||||
MPT_LOCK(mpt);
|
||||
xpt_freeze_simq(mpt->phydisk_sim, 1);
|
||||
MPT_UNLOCK(mpt);
|
||||
error = mpt_kthread_create(mpt_raid_thread, mpt,
|
||||
error = kproc_create(mpt_raid_thread, mpt,
|
||||
&mpt->raid_thread, /*flags*/0, /*altstack*/0,
|
||||
"mpt_raid%d", mpt->unit);
|
||||
if (error != 0) {
|
||||
@ -719,7 +719,7 @@ mpt_raid_thread(void *arg)
|
||||
mpt->raid_thread = NULL;
|
||||
wakeup(&mpt->raid_thread);
|
||||
MPT_UNLOCK(mpt);
|
||||
mpt_kthread_exit(0);
|
||||
kproc_exit(0);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
Loading…
x
Reference in New Issue
Block a user