You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (87 commits) [SCSI] fusion: fix domain validation loops [SCSI] qla2xxx: fix regression on sparc64 [SCSI] modalias for scsi devices [SCSI] sg: cap reserved_size values at max_sectors [SCSI] BusLogic: stop using check_region [SCSI] tgt: fix rdma transfer bugs [SCSI] aacraid: fix aacraid not finding device [SCSI] aacraid: Correct SMC products in aacraid.txt [SCSI] scsi_error.c: Add EH Start Unit retry [SCSI] aacraid: [Fastboot] Panics for AACRAID driver during 'insmod' for kexec test. [SCSI] ipr: Driver version to 2.3.2 [SCSI] ipr: Faster sg list fetch [SCSI] ipr: Return better qc_issue errors [SCSI] ipr: Disrupt device error [SCSI] ipr: Improve async error logging level control [SCSI] ipr: PCI unblock config access fix [SCSI] ipr: Fix for oops following SATA request sense [SCSI] ipr: Log error for SAS dual path switch [SCSI] ipr: Enable logging of debug error data for all devices [SCSI] ipr: Add new PCI-E IDs to device table ...
This commit is contained in:
@@ -37,7 +37,11 @@ Supported Cards/Chipsets
|
||||
9005:0286:9005:029d Adaptec 2420SA (Intruder HP release)
|
||||
9005:0286:9005:02ac Adaptec 1800 (Typhoon44)
|
||||
9005:0285:9005:02b5 Adaptec 5445 (Voodoo44)
|
||||
9005:0285:15d9:02b5 SMC AOC-USAS-S4i
|
||||
9005:0285:15d9:02c9 SMC AOC-USAS-S4iR
|
||||
9005:0285:9005:02b6 Adaptec 5805 (Voodoo80)
|
||||
9005:0285:15d9:02b6 SMC AOC-USAS-S8i
|
||||
9005:0285:15d9:02ca SMC AOC-USAS-S8iR
|
||||
9005:0285:9005:02b7 Adaptec 5085 (Voodoo08)
|
||||
9005:0285:9005:02bb Adaptec 3405 (Marauder40LP)
|
||||
9005:0285:9005:02bc Adaptec 3805 (Marauder80LP)
|
||||
@@ -93,6 +97,9 @@ Supported Cards/Chipsets
|
||||
9005:0286:9005:02ae (Aurora Lite ARK)
|
||||
9005:0285:9005:02b0 (Sunrise Lake ARK)
|
||||
9005:0285:9005:02b1 Adaptec (Voodoo 8 internal 8 external)
|
||||
9005:0285:108e:7aac SUN STK RAID REM (Voodoo44 Coyote)
|
||||
9005:0285:108e:0286 SUN SG-XPCIESAS-R-IN (Cougar)
|
||||
9005:0285:108e:0287 SUN SG-XPCIESAS-R-EX (Prometheus)
|
||||
|
||||
People
|
||||
-------------------------
|
||||
|
||||
@@ -562,11 +562,6 @@ if only one has a flaw for some SCSI feature, you can disable the
|
||||
support by the driver of this feature at linux start-up and enable
|
||||
this feature after boot-up only for devices that support it safely.
|
||||
|
||||
CONFIG_SCSI_NCR53C8XX_PROFILE_SUPPORT (default answer: n)
|
||||
This option must be set for profiling information to be gathered
|
||||
and printed out through the proc file system. This features may
|
||||
impact performances.
|
||||
|
||||
CONFIG_SCSI_NCR53C8XX_IOMAPPED (default answer: n)
|
||||
Answer "y" if you suspect your mother board to not allow memory mapped I/O.
|
||||
May slow down performance a little. This option is required by
|
||||
|
||||
@@ -1925,6 +1925,8 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)
|
||||
blk_queue_max_hw_segments(q, MAX_HW_SEGMENTS);
|
||||
blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS);
|
||||
|
||||
q->sg_reserved_size = INT_MAX;
|
||||
|
||||
/*
|
||||
* all done
|
||||
*/
|
||||
|
||||
+3
-1
@@ -78,7 +78,9 @@ static int sg_set_timeout(request_queue_t *q, int __user *p)
|
||||
|
||||
static int sg_get_reserved_size(request_queue_t *q, int __user *p)
|
||||
{
|
||||
return put_user(q->sg_reserved_size, p);
|
||||
unsigned val = min(q->sg_reserved_size, q->max_sectors << 9);
|
||||
|
||||
return put_user(val, p);
|
||||
}
|
||||
|
||||
static int sg_set_reserved_size(request_queue_t *q, int __user *p)
|
||||
|
||||
@@ -201,7 +201,7 @@ static int iser_post_receive_control(struct iscsi_conn *conn)
|
||||
* what's common for both schemes is that the connection is not started
|
||||
*/
|
||||
if (conn->c_stage != ISCSI_CONN_STARTED)
|
||||
rx_data_size = DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH;
|
||||
rx_data_size = ISCSI_DEF_MAX_RECV_SEG_LEN;
|
||||
else /* FIXME till user space sets conn->max_recv_dlength correctly */
|
||||
rx_data_size = 128;
|
||||
|
||||
|
||||
@@ -1531,6 +1531,7 @@ mpt_resume(struct pci_dev *pdev)
|
||||
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
||||
u32 device_state = pdev->current_state;
|
||||
int recovery_state;
|
||||
int err;
|
||||
|
||||
printk(MYIOC_s_INFO_FMT
|
||||
"pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n",
|
||||
@@ -1538,7 +1539,9 @@ mpt_resume(struct pci_dev *pdev)
|
||||
|
||||
pci_set_power_state(pdev, 0);
|
||||
pci_restore_state(pdev);
|
||||
pci_enable_device(pdev);
|
||||
err = pci_enable_device(pdev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* enable interrupts */
|
||||
CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM);
|
||||
@@ -4739,12 +4742,8 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
|
||||
}
|
||||
|
||||
/**
|
||||
* mpt_inactive_raid_list_free
|
||||
*
|
||||
* This clears this link list.
|
||||
*
|
||||
* @ioc - pointer to per adapter structure
|
||||
*
|
||||
* mpt_inactive_raid_list_free - This clears this link list.
|
||||
* @ioc : pointer to per adapter structure
|
||||
**/
|
||||
static void
|
||||
mpt_inactive_raid_list_free(MPT_ADAPTER *ioc)
|
||||
@@ -4764,15 +4763,11 @@ mpt_inactive_raid_list_free(MPT_ADAPTER *ioc)
|
||||
}
|
||||
|
||||
/**
|
||||
* mpt_inactive_raid_volumes
|
||||
*
|
||||
* This sets up link list of phy_disk_nums for devices belonging in an inactive volume
|
||||
*
|
||||
* @ioc - pointer to per adapter structure
|
||||
* @channel - volume channel
|
||||
* @id - volume target id
|
||||
*
|
||||
* mpt_inactive_raid_volumes - sets up link list of phy_disk_nums for devices belonging in an inactive volume
|
||||
*
|
||||
* @ioc : pointer to per adapter structure
|
||||
* @channel : volume channel
|
||||
* @id : volume target id
|
||||
**/
|
||||
static void
|
||||
mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id)
|
||||
@@ -6663,7 +6658,7 @@ union loginfo_type {
|
||||
/**
|
||||
* mpt_iocstatus_info_config - IOCSTATUS information for config pages
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* ioc_status: U32 IOCStatus word from IOC
|
||||
* @ioc_status: U32 IOCStatus word from IOC
|
||||
* @mf: Pointer to MPT request frame
|
||||
*
|
||||
* Refer to lsi/mpi.h.
|
||||
|
||||
@@ -994,6 +994,7 @@ typedef struct _MPT_SCSI_HOST {
|
||||
int scandv_wait_done;
|
||||
long last_queue_full;
|
||||
u16 tm_iocstatus;
|
||||
u16 spi_pending;
|
||||
struct list_head target_reset_list;
|
||||
} MPT_SCSI_HOST;
|
||||
|
||||
|
||||
@@ -819,10 +819,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
sc->resid=0;
|
||||
case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */
|
||||
case MPI_IOCSTATUS_SUCCESS: /* 0x0000 */
|
||||
if (scsi_status == MPI_SCSI_STATUS_BUSY)
|
||||
sc->result = (DID_BUS_BUSY << 16) | scsi_status;
|
||||
else
|
||||
sc->result = (DID_OK << 16) | scsi_status;
|
||||
sc->result = (DID_OK << 16) | scsi_status;
|
||||
if (scsi_state == 0) {
|
||||
;
|
||||
} else if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID) {
|
||||
@@ -1188,20 +1185,7 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
int
|
||||
mptscsih_resume(struct pci_dev *pdev)
|
||||
{
|
||||
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
||||
struct Scsi_Host *host = ioc->sh;
|
||||
MPT_SCSI_HOST *hd;
|
||||
|
||||
mpt_resume(pdev);
|
||||
|
||||
if(!host)
|
||||
return 0;
|
||||
|
||||
hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
if(!hd)
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
return mpt_resume(pdev);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1537,21 +1521,23 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx)
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/**
|
||||
* mptscsih_TMHandler - Generic handler for SCSI Task Management.
|
||||
* Fall through to mpt_HardResetHandler if: not operational, too many
|
||||
* failed TM requests or handshake failure.
|
||||
*
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @hd: Pointer to MPT SCSI HOST structure
|
||||
* @type: Task Management type
|
||||
* @channel: channel number for task management
|
||||
* @id: Logical Target ID for reset (if appropriate)
|
||||
* @lun: Logical Unit for reset (if appropriate)
|
||||
* @ctx2abort: Context for the task to be aborted (if appropriate)
|
||||
* @timeout: timeout for task management control
|
||||
*
|
||||
* Fall through to mpt_HardResetHandler if: not operational, too many
|
||||
* failed TM requests or handshake failure.
|
||||
*
|
||||
* Remark: Currently invoked from a non-interrupt thread (_bh).
|
||||
*
|
||||
* Remark: With old EH code, at most 1 SCSI TaskMgmt function per IOC
|
||||
* will be active.
|
||||
*
|
||||
* Returns 0 for SUCCESS, or FAILED.
|
||||
* Returns 0 for SUCCESS, or %FAILED.
|
||||
**/
|
||||
int
|
||||
mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout)
|
||||
@@ -1650,9 +1636,11 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
|
||||
* mptscsih_IssueTaskMgmt - Generic send Task Management function.
|
||||
* @hd: Pointer to MPT_SCSI_HOST structure
|
||||
* @type: Task Management type
|
||||
* @channel: channel number for task management
|
||||
* @id: Logical Target ID for reset (if appropriate)
|
||||
* @lun: Logical Unit for reset (if appropriate)
|
||||
* @ctx2abort: Context for the task to be aborted (if appropriate)
|
||||
* @timeout: timeout for task management control
|
||||
*
|
||||
* Remark: _HardResetHandler can be invoked from an interrupt thread (timer)
|
||||
* or a non-interrupt thread. In the former, must not call schedule().
|
||||
@@ -2022,6 +2010,7 @@ mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd)
|
||||
/**
|
||||
* mptscsih_tm_wait_for_completion - wait for completion of TM task
|
||||
* @hd: Pointer to MPT host structure.
|
||||
* @timeout: timeout value
|
||||
*
|
||||
* Returns {SUCCESS,FAILED}.
|
||||
*/
|
||||
|
||||
@@ -96,14 +96,13 @@ static int mptspiTaskCtx = -1;
|
||||
static int mptspiInternalCtx = -1; /* Used only for internal commands */
|
||||
|
||||
/**
|
||||
* mptspi_setTargetNegoParms - Update the target negotiation
|
||||
* parameters based on the the Inquiry data, adapter capabilities,
|
||||
* and NVRAM settings
|
||||
*
|
||||
* mptspi_setTargetNegoParms - Update the target negotiation parameters
|
||||
* @hd: Pointer to a SCSI Host Structure
|
||||
* @vtarget: per target private data
|
||||
* @target: per target private data
|
||||
* @sdev: SCSI device
|
||||
*
|
||||
* Update the target negotiation parameters based on the the Inquiry
|
||||
* data, adapter capabilities, and NVRAM settings.
|
||||
**/
|
||||
static void
|
||||
mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
|
||||
@@ -234,7 +233,7 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
|
||||
/**
|
||||
* mptspi_writeIOCPage4 - write IOC Page 4
|
||||
* @hd: Pointer to a SCSI Host Structure
|
||||
* @channel:
|
||||
* @channel: channel number
|
||||
* @id: write IOC Page4 for this ID & Bus
|
||||
*
|
||||
* Return: -EAGAIN if unable to obtain a Message Frame
|
||||
@@ -446,7 +445,7 @@ static int mptspi_target_alloc(struct scsi_target *starget)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
mptspi_target_destroy(struct scsi_target *starget)
|
||||
{
|
||||
if (starget->hostdata)
|
||||
@@ -677,7 +676,9 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
|
||||
return;
|
||||
}
|
||||
|
||||
hd->spi_pending |= (1 << sdev->id);
|
||||
spi_dv_device(sdev);
|
||||
hd->spi_pending &= ~(1 << sdev->id);
|
||||
|
||||
if (sdev->channel == 1 &&
|
||||
mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
|
||||
@@ -1203,11 +1204,27 @@ mptspi_dv_renegotiate_work(struct work_struct *work)
|
||||
container_of(work, struct work_queue_wrapper, work);
|
||||
struct _MPT_SCSI_HOST *hd = wqw->hd;
|
||||
struct scsi_device *sdev;
|
||||
struct scsi_target *starget;
|
||||
struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1;
|
||||
u32 nego;
|
||||
|
||||
kfree(wqw);
|
||||
|
||||
shost_for_each_device(sdev, hd->ioc->sh)
|
||||
mptspi_dv_device(hd, sdev);
|
||||
if (hd->spi_pending) {
|
||||
shost_for_each_device(sdev, hd->ioc->sh) {
|
||||
if (hd->spi_pending & (1 << sdev->id))
|
||||
continue;
|
||||
starget = scsi_target(sdev);
|
||||
nego = mptspi_getRP(starget);
|
||||
pg1.RequestedParameters = cpu_to_le32(nego);
|
||||
pg1.Reserved = 0;
|
||||
pg1.Configuration = 0;
|
||||
mptspi_write_spi_device_pg1(starget, &pg1);
|
||||
}
|
||||
} else {
|
||||
shost_for_each_device(sdev, hd->ioc->sh)
|
||||
mptspi_dv_device(hd, sdev);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1453,6 +1470,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
init_waitqueue_head(&hd->scandv_waitq);
|
||||
hd->scandv_wait_done = 0;
|
||||
hd->last_queue_full = 0;
|
||||
hd->spi_pending = 0;
|
||||
|
||||
/* Some versions of the firmware don't support page 0; without
|
||||
* that we can't get the parameters */
|
||||
|
||||
@@ -186,7 +186,7 @@ void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, unsigned long timeout)
|
||||
{
|
||||
fsf_req->timer.function = zfcp_fsf_request_timeout_handler;
|
||||
fsf_req->timer.data = (unsigned long) fsf_req->adapter;
|
||||
fsf_req->timer.expires = timeout;
|
||||
fsf_req->timer.expires = jiffies + timeout;
|
||||
add_timer(&fsf_req->timer);
|
||||
}
|
||||
|
||||
|
||||
@@ -299,9 +299,10 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
|
||||
}
|
||||
|
||||
/* log additional information provided by FSF (if any) */
|
||||
if (unlikely(qtcb->header.log_length)) {
|
||||
if (likely(qtcb->header.log_length)) {
|
||||
/* do not trust them ;-) */
|
||||
if (qtcb->header.log_start > sizeof(struct fsf_qtcb)) {
|
||||
if (unlikely(qtcb->header.log_start >
|
||||
sizeof(struct fsf_qtcb))) {
|
||||
ZFCP_LOG_NORMAL
|
||||
("bug: ULP (FSF logging) log data starts "
|
||||
"beyond end of packet header. Ignored. "
|
||||
@@ -310,8 +311,9 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req)
|
||||
sizeof(struct fsf_qtcb));
|
||||
goto forget_log;
|
||||
}
|
||||
if ((size_t) (qtcb->header.log_start + qtcb->header.log_length)
|
||||
> sizeof(struct fsf_qtcb)) {
|
||||
if (unlikely((size_t) (qtcb->header.log_start +
|
||||
qtcb->header.log_length) >
|
||||
sizeof(struct fsf_qtcb))) {
|
||||
ZFCP_LOG_NORMAL("bug: ULP (FSF logging) log data ends "
|
||||
"beyond end of packet header. Ignored. "
|
||||
"(start=%i, length=%i, size=%li)\n",
|
||||
|
||||
+48
-25
@@ -579,17 +579,17 @@ static void __init BusLogic_InitializeProbeInfoListISA(struct BusLogic_HostAdapt
|
||||
/*
|
||||
Append the list of standard BusLogic MultiMaster ISA I/O Addresses.
|
||||
*/
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe330)
|
||||
BusLogic_AppendProbeAddressISA(0x330);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe334)
|
||||
BusLogic_AppendProbeAddressISA(0x334);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe230)
|
||||
BusLogic_AppendProbeAddressISA(0x230);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe234)
|
||||
BusLogic_AppendProbeAddressISA(0x234);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe130)
|
||||
BusLogic_AppendProbeAddressISA(0x130);
|
||||
if (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0)
|
||||
if (!BusLogic_ProbeOptions.LimitedProbeISA || BusLogic_ProbeOptions.Probe134)
|
||||
BusLogic_AppendProbeAddressISA(0x134);
|
||||
}
|
||||
|
||||
@@ -795,7 +795,9 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
|
||||
host adapters are probed.
|
||||
*/
|
||||
if (!BusLogic_ProbeOptions.NoProbeISA)
|
||||
if (PrimaryProbeInfo->IO_Address == 0 && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe330 : check_region(0x330, BusLogic_MultiMasterAddressCount) == 0)) {
|
||||
if (PrimaryProbeInfo->IO_Address == 0 &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe330)) {
|
||||
PrimaryProbeInfo->HostAdapterType = BusLogic_MultiMaster;
|
||||
PrimaryProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
|
||||
PrimaryProbeInfo->IO_Address = 0x330;
|
||||
@@ -805,15 +807,25 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
|
||||
omitting the Primary I/O Address which has already been handled.
|
||||
*/
|
||||
if (!BusLogic_ProbeOptions.NoProbeISA) {
|
||||
if (!StandardAddressSeen[1] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe334 : check_region(0x334, BusLogic_MultiMasterAddressCount) == 0))
|
||||
if (!StandardAddressSeen[1] &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe334))
|
||||
BusLogic_AppendProbeAddressISA(0x334);
|
||||
if (!StandardAddressSeen[2] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe230 : check_region(0x230, BusLogic_MultiMasterAddressCount) == 0))
|
||||
if (!StandardAddressSeen[2] &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe230))
|
||||
BusLogic_AppendProbeAddressISA(0x230);
|
||||
if (!StandardAddressSeen[3] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe234 : check_region(0x234, BusLogic_MultiMasterAddressCount) == 0))
|
||||
if (!StandardAddressSeen[3] &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe234))
|
||||
BusLogic_AppendProbeAddressISA(0x234);
|
||||
if (!StandardAddressSeen[4] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe130 : check_region(0x130, BusLogic_MultiMasterAddressCount) == 0))
|
||||
if (!StandardAddressSeen[4] &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe130))
|
||||
BusLogic_AppendProbeAddressISA(0x130);
|
||||
if (!StandardAddressSeen[5] && (BusLogic_ProbeOptions.LimitedProbeISA ? BusLogic_ProbeOptions.Probe134 : check_region(0x134, BusLogic_MultiMasterAddressCount) == 0))
|
||||
if (!StandardAddressSeen[5] &&
|
||||
(!BusLogic_ProbeOptions.LimitedProbeISA ||
|
||||
BusLogic_ProbeOptions.Probe134))
|
||||
BusLogic_AppendProbeAddressISA(0x134);
|
||||
}
|
||||
/*
|
||||
@@ -2220,22 +2232,35 @@ static int __init BusLogic_init(void)
|
||||
HostAdapter->PCI_Device = ProbeInfo->PCI_Device;
|
||||
HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel;
|
||||
HostAdapter->AddressCount = BusLogic_HostAdapterAddressCount[HostAdapter->HostAdapterType];
|
||||
|
||||
/*
|
||||
Make sure region is free prior to probing.
|
||||
*/
|
||||
if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount,
|
||||
"BusLogic"))
|
||||
continue;
|
||||
/*
|
||||
Probe the Host Adapter. If unsuccessful, abort further initialization.
|
||||
*/
|
||||
if (!BusLogic_ProbeHostAdapter(HostAdapter))
|
||||
if (!BusLogic_ProbeHostAdapter(HostAdapter)) {
|
||||
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
Hard Reset the Host Adapter. If unsuccessful, abort further
|
||||
initialization.
|
||||
*/
|
||||
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true))
|
||||
if (!BusLogic_HardwareResetHostAdapter(HostAdapter, true)) {
|
||||
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
Check the Host Adapter. If unsuccessful, abort further initialization.
|
||||
*/
|
||||
if (!BusLogic_CheckHostAdapter(HostAdapter))
|
||||
if (!BusLogic_CheckHostAdapter(HostAdapter)) {
|
||||
release_region(HostAdapter->IO_Address, HostAdapter->AddressCount);
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
Initialize the Driver Options field if provided.
|
||||
*/
|
||||
@@ -2246,16 +2271,6 @@ static int __init BusLogic_init(void)
|
||||
and Electronic Mail Address.
|
||||
*/
|
||||
BusLogic_AnnounceDriver(HostAdapter);
|
||||
/*
|
||||
Register usage of the I/O Address range. From this point onward, any
|
||||
failure will be assumed to be due to a problem with the Host Adapter,
|
||||
rather than due to having mistakenly identified this port as belonging
|
||||
to a BusLogic Host Adapter. The I/O Address range will not be
|
||||
released, thereby preventing it from being incorrectly identified as
|
||||
any other type of Host Adapter.
|
||||
*/
|
||||
if (!request_region(HostAdapter->IO_Address, HostAdapter->AddressCount, "BusLogic"))
|
||||
continue;
|
||||
/*
|
||||
Register the SCSI Host structure.
|
||||
*/
|
||||
@@ -2280,6 +2295,12 @@ static int __init BusLogic_init(void)
|
||||
Acquire the System Resources necessary to use the Host Adapter, then
|
||||
Create the Initial CCBs, Initialize the Host Adapter, and finally
|
||||
perform Target Device Inquiry.
|
||||
|
||||
From this point onward, any failure will be assumed to be due to a
|
||||
problem with the Host Adapter, rather than due to having mistakenly
|
||||
identified this port as belonging to a BusLogic Host Adapter. The
|
||||
I/O Address range will not be released, thereby preventing it from
|
||||
being incorrectly identified as any other type of Host Adapter.
|
||||
*/
|
||||
if (BusLogic_ReadHostAdapterConfiguration(HostAdapter) &&
|
||||
BusLogic_ReportHostAdapterConfiguration(HostAdapter) &&
|
||||
@@ -3598,6 +3619,7 @@ static void __exit BusLogic_exit(void)
|
||||
|
||||
__setup("BusLogic=", BusLogic_Setup);
|
||||
|
||||
#ifdef MODULE
|
||||
static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
||||
{ PCI_VENDOR_ID_BUSLOGIC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
@@ -3607,6 +3629,7 @@ static struct pci_device_id BusLogic_pci_tbl[] __devinitdata = {
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{ }
|
||||
};
|
||||
#endif
|
||||
MODULE_DEVICE_TABLE(pci, BusLogic_pci_tbl);
|
||||
|
||||
module_init(BusLogic_init);
|
||||
|
||||
+6
-16
@@ -241,6 +241,12 @@ config SCSI_SCAN_ASYNC
|
||||
You can override this choice by specifying "scsi_mod.scan=sync"
|
||||
or async on the kernel's command line.
|
||||
|
||||
config SCSI_WAIT_SCAN
|
||||
tristate
|
||||
default m
|
||||
depends on SCSI
|
||||
depends on MODULES
|
||||
|
||||
menu "SCSI Transports"
|
||||
depends on SCSI
|
||||
|
||||
@@ -1194,17 +1200,6 @@ config SCSI_NCR53C8XX_SYNC
|
||||
There is no safe option other than using good cabling, right
|
||||
terminations and SCSI conformant devices.
|
||||
|
||||
config SCSI_NCR53C8XX_PROFILE
|
||||
bool "enable profiling"
|
||||
depends on SCSI_ZALON || SCSI_NCR_Q720
|
||||
help
|
||||
This option allows you to enable profiling information gathering.
|
||||
These statistics are not very accurate due to the low frequency
|
||||
of the kernel clock (100 Hz on i386) and have performance impact
|
||||
on systems that use very fast devices.
|
||||
|
||||
The normal answer therefore is N.
|
||||
|
||||
config SCSI_NCR53C8XX_NO_DISCONNECT
|
||||
bool "not allow targets to disconnect"
|
||||
depends on (SCSI_ZALON || SCSI_NCR_Q720) && SCSI_NCR53C8XX_DEFAULT_TAGS=0
|
||||
@@ -1334,11 +1329,6 @@ config SCSI_SIM710
|
||||
|
||||
It currently supports Compaq EISA cards and NCR MCA cards
|
||||
|
||||
config 53C700_IO_MAPPED
|
||||
bool
|
||||
depends on SCSI_SIM710
|
||||
default y
|
||||
|
||||
config SCSI_SYM53C416
|
||||
tristate "Symbios 53c416 SCSI support"
|
||||
depends on ISA && SCSI
|
||||
|
||||
@@ -146,7 +146,7 @@ obj-$(CONFIG_CHR_DEV_SCH) += ch.o
|
||||
# This goes last, so that "real" scsi devices probe earlier
|
||||
obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o
|
||||
|
||||
obj-$(CONFIG_SCSI) += scsi_wait_scan.o
|
||||
obj-$(CONFIG_SCSI_WAIT_SCAN) += scsi_wait_scan.o
|
||||
|
||||
scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o \
|
||||
scsicam.o scsi_error.o scsi_lib.o \
|
||||
|
||||
+244
-170
File diff suppressed because it is too large
Load Diff
@@ -12,8 +12,8 @@
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef AAC_DRIVER_BUILD
|
||||
# define AAC_DRIVER_BUILD 2423
|
||||
# define AAC_DRIVER_BRANCH "-mh3"
|
||||
# define AAC_DRIVER_BUILD 2437
|
||||
# define AAC_DRIVER_BRANCH "-mh4"
|
||||
#endif
|
||||
#define MAXIMUM_NUM_CONTAINERS 32
|
||||
|
||||
@@ -48,49 +48,13 @@ struct diskparm
|
||||
|
||||
|
||||
/*
|
||||
* DON'T CHANGE THE ORDER, this is set by the firmware
|
||||
* Firmware constants
|
||||
*/
|
||||
|
||||
#define CT_NONE 0
|
||||
#define CT_VOLUME 1
|
||||
#define CT_MIRROR 2
|
||||
#define CT_STRIPE 3
|
||||
#define CT_RAID5 4
|
||||
#define CT_SSRW 5
|
||||
#define CT_SSRO 6
|
||||
#define CT_MORPH 7
|
||||
#define CT_PASSTHRU 8
|
||||
#define CT_RAID4 9
|
||||
#define CT_RAID10 10 /* stripe of mirror */
|
||||
#define CT_RAID00 11 /* stripe of stripe */
|
||||
#define CT_VOLUME_OF_MIRRORS 12 /* volume of mirror */
|
||||
#define CT_PSEUDO_RAID 13 /* really raid4 */
|
||||
#define CT_LAST_VOLUME_TYPE 14
|
||||
#define CT_OK 218
|
||||
|
||||
/*
|
||||
* Types of objects addressable in some fashion by the client.
|
||||
* This is a superset of those objects handled just by the filesystem
|
||||
* and includes "raw" objects that an administrator would use to
|
||||
* configure containers and filesystems.
|
||||
*/
|
||||
|
||||
#define FT_REG 1 /* regular file */
|
||||
#define FT_DIR 2 /* directory */
|
||||
#define FT_BLK 3 /* "block" device - reserved */
|
||||
#define FT_CHR 4 /* "character special" device - reserved */
|
||||
#define FT_LNK 5 /* symbolic link */
|
||||
#define FT_SOCK 6 /* socket */
|
||||
#define FT_FIFO 7 /* fifo */
|
||||
#define FT_FILESYS 8 /* ADAPTEC's "FSA"(tm) filesystem */
|
||||
#define FT_DRIVE 9 /* physical disk - addressable in scsi by bus/id/lun */
|
||||
#define FT_SLICE 10 /* virtual disk - raw volume - slice */
|
||||
#define FT_PARTITION 11 /* FSA partition - carved out of a slice - building block for containers */
|
||||
#define FT_VOLUME 12 /* Container - Volume Set */
|
||||
#define FT_STRIPE 13 /* Container - Stripe Set */
|
||||
#define FT_MIRROR 14 /* Container - Mirror Set */
|
||||
#define FT_RAID5 15 /* Container - Raid 5 Set */
|
||||
#define FT_DATABASE 16 /* Storage object with "foreign" content manager */
|
||||
|
||||
/*
|
||||
* Host side memory scatter gather list
|
||||
@@ -497,6 +461,7 @@ struct adapter_ops
|
||||
void (*adapter_enable_int)(struct aac_dev *dev);
|
||||
int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
|
||||
int (*adapter_check_health)(struct aac_dev *dev);
|
||||
int (*adapter_restart)(struct aac_dev *dev, int bled);
|
||||
/* Transport operations */
|
||||
int (*adapter_ioremap)(struct aac_dev * dev, u32 size);
|
||||
irqreturn_t (*adapter_intr)(int irq, void *dev_id);
|
||||
@@ -833,7 +798,7 @@ struct fib {
|
||||
*/
|
||||
struct list_head fiblink;
|
||||
void *data;
|
||||
struct hw_fib *hw_fib; /* Actual shared object */
|
||||
struct hw_fib *hw_fib_va; /* Actual shared object */
|
||||
dma_addr_t hw_fib_pa; /* physical address of hw_fib*/
|
||||
};
|
||||
|
||||
@@ -878,10 +843,25 @@ struct aac_supplement_adapter_info
|
||||
__le32 Version;
|
||||
__le32 FeatureBits;
|
||||
u8 SlotNumber;
|
||||
u8 ReservedPad0[0];
|
||||
u8 ReservedPad0[3];
|
||||
u8 BuildDate[12];
|
||||
__le32 CurrentNumberPorts;
|
||||
__le32 ReservedGrowth[24];
|
||||
struct {
|
||||
u8 AssemblyPn[8];
|
||||
u8 FruPn[8];
|
||||
u8 BatteryFruPn[8];
|
||||
u8 EcVersionString[8];
|
||||
u8 Tsid[12];
|
||||
} VpdInfo;
|
||||
__le32 FlashFirmwareRevision;
|
||||
__le32 FlashFirmwareBuild;
|
||||
__le32 RaidTypeMorphOptions;
|
||||
__le32 FlashFirmwareBootRevision;
|
||||
__le32 FlashFirmwareBootBuild;
|
||||
u8 MfgPcbaSerialNo[12];
|
||||
u8 MfgWWNName[8];
|
||||
__le32 MoreFeatureBits;
|
||||
__le32 ReservedGrowth[1];
|
||||
};
|
||||
#define AAC_FEATURE_FALCON 0x00000010
|
||||
#define AAC_SIS_VERSION_V3 3
|
||||
@@ -970,7 +950,6 @@ struct aac_dev
|
||||
struct fib *fibs;
|
||||
|
||||
struct fib *free_fib;
|
||||
struct fib *timeout_fib;
|
||||
spinlock_t fib_lock;
|
||||
|
||||
struct aac_queue_block *queues;
|
||||
@@ -1060,6 +1039,9 @@ struct aac_dev
|
||||
#define aac_adapter_check_health(dev) \
|
||||
(dev)->a_ops.adapter_check_health(dev)
|
||||
|
||||
#define aac_adapter_restart(dev,bled) \
|
||||
(dev)->a_ops.adapter_restart(dev,bled)
|
||||
|
||||
#define aac_adapter_ioremap(dev, size) \
|
||||
(dev)->a_ops.adapter_ioremap(dev, size)
|
||||
|
||||
@@ -1516,8 +1498,7 @@ struct aac_mntent {
|
||||
struct creation_info create_info; /* if applicable */
|
||||
__le32 capacity;
|
||||
__le32 vol; /* substrate structure */
|
||||
__le32 obj; /* FT_FILESYS,
|
||||
FT_DATABASE, etc. */
|
||||
__le32 obj; /* FT_FILESYS, etc. */
|
||||
__le32 state; /* unready for mounting,
|
||||
readonly, etc. */
|
||||
union aac_contentinfo fileinfo; /* Info specific to content
|
||||
@@ -1817,7 +1798,7 @@ int aac_fib_send(u16 command, struct fib * context, unsigned long size, int prio
|
||||
int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry);
|
||||
void aac_consumer_free(struct aac_dev * dev, struct aac_queue * q, u32 qnum);
|
||||
int aac_fib_complete(struct fib * context);
|
||||
#define fib_data(fibctx) ((void *)(fibctx)->hw_fib->data)
|
||||
#define fib_data(fibctx) ((void *)(fibctx)->hw_fib_va->data)
|
||||
struct aac_dev *aac_init_adapter(struct aac_dev *dev);
|
||||
int aac_get_config_status(struct aac_dev *dev, int commit_flag);
|
||||
int aac_get_containers(struct aac_dev *dev);
|
||||
@@ -1840,8 +1821,11 @@ struct aac_driver_ident* aac_get_driver_ident(int devtype);
|
||||
int aac_get_adapter_info(struct aac_dev* dev);
|
||||
int aac_send_shutdown(struct aac_dev *dev);
|
||||
int aac_probe_container(struct aac_dev *dev, int cid);
|
||||
int _aac_rx_init(struct aac_dev *dev);
|
||||
int aac_rx_select_comm(struct aac_dev *dev, int comm);
|
||||
extern int numacb;
|
||||
extern int acbsize;
|
||||
extern char aac_driver_version[];
|
||||
extern int startup_timeout;
|
||||
extern int aif_timeout;
|
||||
extern int expose_physicals;
|
||||
|
||||
+172
-112
@@ -5,7 +5,7 @@
|
||||
* based on the old aacraid driver that is..
|
||||
* Adaptec aacraid device driver for Linux.
|
||||
*
|
||||
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
* Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -64,12 +64,15 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
||||
unsigned size;
|
||||
int retval;
|
||||
|
||||
if (dev->in_reset) {
|
||||
return -EBUSY;
|
||||
}
|
||||
fibptr = aac_fib_alloc(dev);
|
||||
if(fibptr == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kfib = fibptr->hw_fib;
|
||||
kfib = fibptr->hw_fib_va;
|
||||
/*
|
||||
* First copy in the header so that we can check the size field.
|
||||
*/
|
||||
@@ -91,9 +94,9 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
||||
goto cleanup;
|
||||
}
|
||||
/* Highjack the hw_fib */
|
||||
hw_fib = fibptr->hw_fib;
|
||||
hw_fib = fibptr->hw_fib_va;
|
||||
hw_fib_pa = fibptr->hw_fib_pa;
|
||||
fibptr->hw_fib = kfib = pci_alloc_consistent(dev->pdev, size, &fibptr->hw_fib_pa);
|
||||
fibptr->hw_fib_va = kfib = pci_alloc_consistent(dev->pdev, size, &fibptr->hw_fib_pa);
|
||||
memset(((char *)kfib) + dev->max_fib_size, 0, size - dev->max_fib_size);
|
||||
memcpy(kfib, hw_fib, dev->max_fib_size);
|
||||
}
|
||||
@@ -137,7 +140,7 @@ cleanup:
|
||||
if (hw_fib) {
|
||||
pci_free_consistent(dev->pdev, size, kfib, fibptr->hw_fib_pa);
|
||||
fibptr->hw_fib_pa = hw_fib_pa;
|
||||
fibptr->hw_fib = hw_fib;
|
||||
fibptr->hw_fib_va = hw_fib;
|
||||
}
|
||||
if (retval != -EINTR)
|
||||
aac_fib_free(fibptr);
|
||||
@@ -282,15 +285,15 @@ return_fib:
|
||||
fib = list_entry(entry, struct fib, fiblink);
|
||||
fibctx->count--;
|
||||
spin_unlock_irqrestore(&dev->fib_lock, flags);
|
||||
if (copy_to_user(f.fib, fib->hw_fib, sizeof(struct hw_fib))) {
|
||||
kfree(fib->hw_fib);
|
||||
if (copy_to_user(f.fib, fib->hw_fib_va, sizeof(struct hw_fib))) {
|
||||
kfree(fib->hw_fib_va);
|
||||
kfree(fib);
|
||||
return -EFAULT;
|
||||
}
|
||||
/*
|
||||
* Free the space occupied by this copy of the fib.
|
||||
*/
|
||||
kfree(fib->hw_fib);
|
||||
kfree(fib->hw_fib_va);
|
||||
kfree(fib);
|
||||
status = 0;
|
||||
} else {
|
||||
@@ -340,7 +343,7 @@ int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context * fibctx)
|
||||
/*
|
||||
* Free the space occupied by this copy of the fib.
|
||||
*/
|
||||
kfree(fib->hw_fib);
|
||||
kfree(fib->hw_fib_va);
|
||||
kfree(fib);
|
||||
}
|
||||
/*
|
||||
@@ -388,10 +391,8 @@ static int close_getadapter_fib(struct aac_dev * dev, void __user *arg)
|
||||
/*
|
||||
* Extract the fibctx from the input parameters
|
||||
*/
|
||||
if (fibctx->unique == (u32)(unsigned long)arg) {
|
||||
/* We found a winner */
|
||||
if (fibctx->unique == (u32)(ptrdiff_t)arg) /* We found a winner */
|
||||
break;
|
||||
}
|
||||
entry = entry->next;
|
||||
fibctx = NULL;
|
||||
}
|
||||
@@ -465,16 +466,20 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
void *sg_list[32];
|
||||
u32 sg_indx = 0;
|
||||
u32 byte_count = 0;
|
||||
u32 actual_fibsize = 0;
|
||||
u32 actual_fibsize64, actual_fibsize = 0;
|
||||
int i;
|
||||
|
||||
|
||||
if (dev->in_reset) {
|
||||
dprintk((KERN_DEBUG"aacraid: send raw srb -EBUSY\n"));
|
||||
return -EBUSY;
|
||||
}
|
||||
if (!capable(CAP_SYS_ADMIN)){
|
||||
dprintk((KERN_DEBUG"aacraid: No permission to send raw srb\n"));
|
||||
return -EPERM;
|
||||
}
|
||||
/*
|
||||
* Allocate and initialize a Fib then setup a BlockWrite command
|
||||
* Allocate and initialize a Fib then setup a SRB command
|
||||
*/
|
||||
if (!(srbfib = aac_fib_alloc(dev))) {
|
||||
return -ENOMEM;
|
||||
@@ -541,129 +546,183 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if (dev->dac_support == 1) {
|
||||
actual_fibsize = sizeof(struct aac_srb) - sizeof(struct sgentry) +
|
||||
((user_srbcmd->sg.count & 0xff) * sizeof(struct sgentry));
|
||||
actual_fibsize64 = actual_fibsize + (user_srbcmd->sg.count & 0xff) *
|
||||
(sizeof(struct sgentry64) - sizeof(struct sgentry));
|
||||
/* User made a mistake - should not continue */
|
||||
if ((actual_fibsize != fibsize) && (actual_fibsize64 != fibsize)) {
|
||||
dprintk((KERN_DEBUG"aacraid: Bad Size specified in "
|
||||
"Raw SRB command calculated fibsize=%lu;%lu "
|
||||
"user_srbcmd->sg.count=%d aac_srb=%lu sgentry=%lu;%lu "
|
||||
"issued fibsize=%d\n",
|
||||
actual_fibsize, actual_fibsize64, user_srbcmd->sg.count,
|
||||
sizeof(struct aac_srb), sizeof(struct sgentry),
|
||||
sizeof(struct sgentry64), fibsize));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((data_dir == DMA_NONE) && user_srbcmd->sg.count) {
|
||||
dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
byte_count = 0;
|
||||
if (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64) {
|
||||
struct user_sgmap64* upsg = (struct user_sgmap64*)&user_srbcmd->sg;
|
||||
struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
|
||||
struct user_sgmap* usg;
|
||||
byte_count = 0;
|
||||
|
||||
/*
|
||||
* This should also catch if user used the 32 bit sgmap
|
||||
*/
|
||||
actual_fibsize = sizeof(struct aac_srb) -
|
||||
sizeof(struct sgentry) +
|
||||
((upsg->count & 0xff) *
|
||||
sizeof(struct sgentry));
|
||||
if(actual_fibsize != fibsize){ // User made a mistake - should not continue
|
||||
dprintk((KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
usg = kmalloc(actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap), GFP_KERNEL);
|
||||
if (!usg) {
|
||||
dprintk((KERN_DEBUG"aacraid: Allocation error in Raw SRB command\n"));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
memcpy (usg, upsg, actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap));
|
||||
actual_fibsize = sizeof(struct aac_srb) -
|
||||
sizeof(struct sgentry) + ((usg->count & 0xff) *
|
||||
sizeof(struct sgentry64));
|
||||
if ((data_dir == DMA_NONE) && upsg->count) {
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if (actual_fibsize64 == fibsize) {
|
||||
actual_fibsize = actual_fibsize64;
|
||||
for (i = 0; i < upsg->count; i++) {
|
||||
u64 addr;
|
||||
void* p;
|
||||
/* Does this really need to be GFP_DMA? */
|
||||
p = kmalloc(upsg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
if(p == 0) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
upsg->sg[i].count,i,upsg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
addr = (u64)upsg->sg[i].addr[0];
|
||||
addr += ((u64)upsg->sg[i].addr[1]) << 32;
|
||||
sg_user[i] = (void __user *)(ptrdiff_t)addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
for (i = 0; i < usg->count; i++) {
|
||||
u64 addr;
|
||||
void* p;
|
||||
/* Does this really need to be GFP_DMA? */
|
||||
p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
if(p == 0) {
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
usg->sg[i].count,i,usg->count));
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, upsg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
|
||||
byte_count += upsg->sg[i].count;
|
||||
psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);
|
||||
}
|
||||
} else {
|
||||
struct user_sgmap* usg;
|
||||
usg = kmalloc(actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap), GFP_KERNEL);
|
||||
if (!usg) {
|
||||
dprintk((KERN_DEBUG"aacraid: Allocation error in Raw SRB command\n"));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)(long)usg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
memcpy (usg, upsg, actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap));
|
||||
actual_fibsize = actual_fibsize64;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
|
||||
for (i = 0; i < usg->count; i++) {
|
||||
u64 addr;
|
||||
void* p;
|
||||
/* Does this really need to be GFP_DMA? */
|
||||
p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
if(p == 0) {
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
usg->sg[i].count,i,usg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)(ptrdiff_t)usg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, usg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
|
||||
byte_count += usg->sg[i].count;
|
||||
psg->sg[i].count = cpu_to_le32(usg->sg[i].count);
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, usg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
|
||||
psg->sg[i].count = cpu_to_le32(usg->sg[i].count);
|
||||
byte_count += usg->sg[i].count;
|
||||
kfree (usg);
|
||||
}
|
||||
kfree (usg);
|
||||
|
||||
srbcmd->count = cpu_to_le32(byte_count);
|
||||
psg->count = cpu_to_le32(sg_indx+1);
|
||||
status = aac_fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
|
||||
} else {
|
||||
struct user_sgmap* upsg = &user_srbcmd->sg;
|
||||
struct sgmap* psg = &srbcmd->sg;
|
||||
byte_count = 0;
|
||||
|
||||
actual_fibsize = sizeof (struct aac_srb) + (((user_srbcmd->sg.count & 0xff) - 1) * sizeof (struct sgentry));
|
||||
if(actual_fibsize != fibsize){ // User made a mistake - should not continue
|
||||
dprintk((KERN_DEBUG"aacraid: Bad Size specified in "
|
||||
"Raw SRB command calculated fibsize=%d "
|
||||
"user_srbcmd->sg.count=%d aac_srb=%d sgentry=%d "
|
||||
"issued fibsize=%d\n",
|
||||
actual_fibsize, user_srbcmd->sg.count,
|
||||
sizeof(struct aac_srb), sizeof(struct sgentry),
|
||||
fibsize));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((data_dir == DMA_NONE) && upsg->count) {
|
||||
dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
for (i = 0; i < upsg->count; i++) {
|
||||
dma_addr_t addr;
|
||||
void* p;
|
||||
p = kmalloc(upsg->sg[i].count, GFP_KERNEL);
|
||||
if(p == 0) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
upsg->sg[i].count, i, upsg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)(long)upsg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p, sg_user[i],
|
||||
upsg->sg[i].count)) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
if (actual_fibsize64 == fibsize) {
|
||||
struct user_sgmap64* usg = (struct user_sgmap64 *)upsg;
|
||||
for (i = 0; i < upsg->count; i++) {
|
||||
u64 addr;
|
||||
void* p;
|
||||
/* Does this really need to be GFP_DMA? */
|
||||
p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
if(p == 0) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
usg->sg[i].count,i,usg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p,
|
||||
upsg->sg[i].count, data_dir);
|
||||
addr = (u64)usg->sg[i].addr[0];
|
||||
addr += ((u64)usg->sg[i].addr[1]) << 32;
|
||||
sg_user[i] = (void __user *)(ptrdiff_t)addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
psg->sg[i].addr = cpu_to_le32(addr);
|
||||
psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);
|
||||
byte_count += upsg->sg[i].count;
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],usg->sg[i].count)){
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, usg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr = cpu_to_le32(addr & 0xffffffff);
|
||||
byte_count += usg->sg[i].count;
|
||||
psg->sg[i].count = cpu_to_le32(usg->sg[i].count);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < upsg->count; i++) {
|
||||
dma_addr_t addr;
|
||||
void* p;
|
||||
p = kmalloc(upsg->sg[i].count, GFP_KERNEL);
|
||||
if(p == 0) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
upsg->sg[i].count, i, upsg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)(ptrdiff_t)upsg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p, sg_user[i],
|
||||
upsg->sg[i].count)) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p,
|
||||
upsg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr = cpu_to_le32(addr);
|
||||
byte_count += upsg->sg[i].count;
|
||||
psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);
|
||||
}
|
||||
}
|
||||
srbcmd->count = cpu_to_le32(byte_count);
|
||||
psg->count = cpu_to_le32(sg_indx+1);
|
||||
@@ -682,7 +741,8 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
|
||||
if( flags & SRB_DataIn ) {
|
||||
for(i = 0 ; i <= sg_indx; i++){
|
||||
byte_count = le32_to_cpu((dev->dac_support == 1)
|
||||
byte_count = le32_to_cpu(
|
||||
(dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)
|
||||
? ((struct sgmap64*)&srbcmd->sg)->sg[i].count
|
||||
: srbcmd->sg.sg[i].count);
|
||||
if(copy_to_user(sg_user[i], sg_list[i], byte_count)){
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* based on the old aacraid driver that is..
|
||||
* Adaptec aacraid device driver for Linux.
|
||||
*
|
||||
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
* Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -110,7 +110,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
|
||||
/*
|
||||
* Align the beginning of Headers to commalign
|
||||
*/
|
||||
align = (commalign - ((unsigned long)(base) & (commalign - 1)));
|
||||
align = (commalign - ((ptrdiff_t)(base) & (commalign - 1)));
|
||||
base = base + align;
|
||||
phys = phys + align;
|
||||
/*
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* based on the old aacraid driver that is..
|
||||
* Adaptec aacraid device driver for Linux.
|
||||
*
|
||||
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
* Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -94,7 +94,7 @@ void aac_fib_map_free(struct aac_dev *dev)
|
||||
int aac_fib_setup(struct aac_dev * dev)
|
||||
{
|
||||
struct fib *fibptr;
|
||||
struct hw_fib *hw_fib_va;
|
||||
struct hw_fib *hw_fib;
|
||||
dma_addr_t hw_fib_pa;
|
||||
int i;
|
||||
|
||||
@@ -106,24 +106,24 @@ int aac_fib_setup(struct aac_dev * dev)
|
||||
if (i<0)
|
||||
return -ENOMEM;
|
||||
|
||||
hw_fib_va = dev->hw_fib_va;
|
||||
hw_fib = dev->hw_fib_va;
|
||||
hw_fib_pa = dev->hw_fib_pa;
|
||||
memset(hw_fib_va, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
|
||||
memset(hw_fib, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
|
||||
/*
|
||||
* Initialise the fibs
|
||||
*/
|
||||
for (i = 0, fibptr = &dev->fibs[i]; i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); i++, fibptr++)
|
||||
{
|
||||
fibptr->dev = dev;
|
||||
fibptr->hw_fib = hw_fib_va;
|
||||
fibptr->data = (void *) fibptr->hw_fib->data;
|
||||
fibptr->hw_fib_va = hw_fib;
|
||||
fibptr->data = (void *) fibptr->hw_fib_va->data;
|
||||
fibptr->next = fibptr+1; /* Forward chain the fibs */
|
||||
init_MUTEX_LOCKED(&fibptr->event_wait);
|
||||
spin_lock_init(&fibptr->event_lock);
|
||||
hw_fib_va->header.XferState = cpu_to_le32(0xffffffff);
|
||||
hw_fib_va->header.SenderSize = cpu_to_le16(dev->max_fib_size);
|
||||
hw_fib->header.XferState = cpu_to_le32(0xffffffff);
|
||||
hw_fib->header.SenderSize = cpu_to_le16(dev->max_fib_size);
|
||||
fibptr->hw_fib_pa = hw_fib_pa;
|
||||
hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + dev->max_fib_size);
|
||||
hw_fib = (struct hw_fib *)((unsigned char *)hw_fib + dev->max_fib_size);
|
||||
hw_fib_pa = hw_fib_pa + dev->max_fib_size;
|
||||
}
|
||||
/*
|
||||
@@ -166,7 +166,7 @@ struct fib *aac_fib_alloc(struct aac_dev *dev)
|
||||
* Null out fields that depend on being zero at the start of
|
||||
* each I/O
|
||||
*/
|
||||
fibptr->hw_fib->header.XferState = 0;
|
||||
fibptr->hw_fib_va->header.XferState = 0;
|
||||
fibptr->callback = NULL;
|
||||
fibptr->callback_data = NULL;
|
||||
|
||||
@@ -178,7 +178,6 @@ struct fib *aac_fib_alloc(struct aac_dev *dev)
|
||||
* @fibptr: fib to free up
|
||||
*
|
||||
* Frees up a fib and places it on the appropriate queue
|
||||
* (either free or timed out)
|
||||
*/
|
||||
|
||||
void aac_fib_free(struct fib *fibptr)
|
||||
@@ -186,19 +185,15 @@ void aac_fib_free(struct fib *fibptr)
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&fibptr->dev->fib_lock, flags);
|
||||
if (fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT) {
|
||||
if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT))
|
||||
aac_config.fib_timeouts++;
|
||||
fibptr->next = fibptr->dev->timeout_fib;
|
||||
fibptr->dev->timeout_fib = fibptr;
|
||||
} else {
|
||||
if (fibptr->hw_fib->header.XferState != 0) {
|
||||
printk(KERN_WARNING "aac_fib_free, XferState != 0, fibptr = 0x%p, XferState = 0x%x\n",
|
||||
(void*)fibptr,
|
||||
le32_to_cpu(fibptr->hw_fib->header.XferState));
|
||||
}
|
||||
fibptr->next = fibptr->dev->free_fib;
|
||||
fibptr->dev->free_fib = fibptr;
|
||||
}
|
||||
if (fibptr->hw_fib_va->header.XferState != 0) {
|
||||
printk(KERN_WARNING "aac_fib_free, XferState != 0, fibptr = 0x%p, XferState = 0x%x\n",
|
||||
(void*)fibptr,
|
||||
le32_to_cpu(fibptr->hw_fib_va->header.XferState));
|
||||
}
|
||||
fibptr->next = fibptr->dev->free_fib;
|
||||
fibptr->dev->free_fib = fibptr;
|
||||
spin_unlock_irqrestore(&fibptr->dev->fib_lock, flags);
|
||||
}
|
||||
|
||||
@@ -211,7 +206,7 @@ void aac_fib_free(struct fib *fibptr)
|
||||
|
||||
void aac_fib_init(struct fib *fibptr)
|
||||
{
|
||||
struct hw_fib *hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib *hw_fib = fibptr->hw_fib_va;
|
||||
|
||||
hw_fib->header.StructType = FIB_MAGIC;
|
||||
hw_fib->header.Size = cpu_to_le16(fibptr->dev->max_fib_size);
|
||||
@@ -231,7 +226,7 @@ void aac_fib_init(struct fib *fibptr)
|
||||
|
||||
static void fib_dealloc(struct fib * fibptr)
|
||||
{
|
||||
struct hw_fib *hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib *hw_fib = fibptr->hw_fib_va;
|
||||
BUG_ON(hw_fib->header.StructType != FIB_MAGIC);
|
||||
hw_fib->header.XferState = 0;
|
||||
}
|
||||
@@ -386,7 +381,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
|
||||
void *callback_data)
|
||||
{
|
||||
struct aac_dev * dev = fibptr->dev;
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib_va;
|
||||
unsigned long flags = 0;
|
||||
unsigned long qflags;
|
||||
|
||||
@@ -430,7 +425,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
|
||||
*/
|
||||
hw_fib->header.Command = cpu_to_le16(command);
|
||||
hw_fib->header.XferState |= cpu_to_le32(SentFromHost);
|
||||
fibptr->hw_fib->header.Flags = 0; /* 0 the flags field - internal only*/
|
||||
fibptr->hw_fib_va->header.Flags = 0; /* 0 the flags field - internal only*/
|
||||
/*
|
||||
* Set the size of the Fib we want to send to the adapter
|
||||
*/
|
||||
@@ -462,7 +457,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
|
||||
dprintk((KERN_DEBUG " Command = %d.\n", le32_to_cpu(hw_fib->header.Command)));
|
||||
dprintk((KERN_DEBUG " SubCommand = %d.\n", le32_to_cpu(((struct aac_query_mount *)fib_data(fibptr))->command)));
|
||||
dprintk((KERN_DEBUG " XferState = %x.\n", le32_to_cpu(hw_fib->header.XferState)));
|
||||
dprintk((KERN_DEBUG " hw_fib va being sent=%p\n",fibptr->hw_fib));
|
||||
dprintk((KERN_DEBUG " hw_fib va being sent=%p\n",fibptr->hw_fib_va));
|
||||
dprintk((KERN_DEBUG " hw_fib pa being sent=%lx\n",(ulong)fibptr->hw_fib_pa));
|
||||
dprintk((KERN_DEBUG " fib being sent=%p\n",fibptr));
|
||||
|
||||
@@ -513,22 +508,20 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
|
||||
}
|
||||
udelay(5);
|
||||
}
|
||||
} else if (down_interruptible(&fibptr->event_wait)) {
|
||||
spin_lock_irqsave(&fibptr->event_lock, flags);
|
||||
if (fibptr->done == 0) {
|
||||
fibptr->done = 2; /* Tell interrupt we aborted */
|
||||
spin_unlock_irqrestore(&fibptr->event_lock, flags);
|
||||
return -EINTR;
|
||||
}
|
||||
} else
|
||||
(void)down_interruptible(&fibptr->event_wait);
|
||||
spin_lock_irqsave(&fibptr->event_lock, flags);
|
||||
if (fibptr->done == 0) {
|
||||
fibptr->done = 2; /* Tell interrupt we aborted */
|
||||
spin_unlock_irqrestore(&fibptr->event_lock, flags);
|
||||
return -EINTR;
|
||||
}
|
||||
spin_unlock_irqrestore(&fibptr->event_lock, flags);
|
||||
BUG_ON(fibptr->done == 0);
|
||||
|
||||
if((fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT)){
|
||||
if(unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT))
|
||||
return -ETIMEDOUT;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* If the user does not want a response than return success otherwise
|
||||
@@ -624,7 +617,7 @@ void aac_consumer_free(struct aac_dev * dev, struct aac_queue *q, u32 qid)
|
||||
|
||||
int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
|
||||
{
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib_va;
|
||||
struct aac_dev * dev = fibptr->dev;
|
||||
struct aac_queue * q;
|
||||
unsigned long nointr = 0;
|
||||
@@ -688,7 +681,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
|
||||
|
||||
int aac_fib_complete(struct fib *fibptr)
|
||||
{
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib_va;
|
||||
|
||||
/*
|
||||
* Check for a fib which has already been completed
|
||||
@@ -774,9 +767,8 @@ void aac_printf(struct aac_dev *dev, u32 val)
|
||||
#define AIF_SNIFF_TIMEOUT (30*HZ)
|
||||
static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
{
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib;
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib_va;
|
||||
struct aac_aifcmd * aifcmd = (struct aac_aifcmd *)hw_fib->data;
|
||||
int busy;
|
||||
u32 container;
|
||||
struct scsi_device *device;
|
||||
enum {
|
||||
@@ -988,9 +980,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
* behind you.
|
||||
*/
|
||||
|
||||
busy = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Find the scsi_device associated with the SCSI address,
|
||||
* and mark it as changed, invalidating the cache. This deals
|
||||
@@ -1035,7 +1024,6 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
static int _aac_reset_adapter(struct aac_dev *aac)
|
||||
{
|
||||
int index, quirks;
|
||||
u32 ret;
|
||||
int retval;
|
||||
struct Scsi_Host *host;
|
||||
struct scsi_device *dev;
|
||||
@@ -1059,35 +1047,29 @@ static int _aac_reset_adapter(struct aac_dev *aac)
|
||||
* If a positive health, means in a known DEAD PANIC
|
||||
* state and the adapter could be reset to `try again'.
|
||||
*/
|
||||
retval = aac_adapter_check_health(aac);
|
||||
if (retval == 0)
|
||||
retval = aac_adapter_sync_cmd(aac, IOP_RESET_ALWAYS,
|
||||
0, 0, 0, 0, 0, 0, &ret, NULL, NULL, NULL, NULL);
|
||||
if (retval)
|
||||
retval = aac_adapter_sync_cmd(aac, IOP_RESET,
|
||||
0, 0, 0, 0, 0, 0, &ret, NULL, NULL, NULL, NULL);
|
||||
retval = aac_adapter_restart(aac, aac_adapter_check_health(aac));
|
||||
|
||||
if (retval)
|
||||
goto out;
|
||||
if (ret != 0x00000001) {
|
||||
retval = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Loop through the fibs, close the synchronous FIBS
|
||||
*/
|
||||
for (index = 0; index < (aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); index++) {
|
||||
for (retval = 1, index = 0; index < (aac->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); index++) {
|
||||
struct fib *fib = &aac->fibs[index];
|
||||
if (!(fib->hw_fib->header.XferState & cpu_to_le32(NoResponseExpected | Async)) &&
|
||||
(fib->hw_fib->header.XferState & cpu_to_le32(ResponseExpected))) {
|
||||
if (!(fib->hw_fib_va->header.XferState & cpu_to_le32(NoResponseExpected | Async)) &&
|
||||
(fib->hw_fib_va->header.XferState & cpu_to_le32(ResponseExpected))) {
|
||||
unsigned long flagv;
|
||||
spin_lock_irqsave(&fib->event_lock, flagv);
|
||||
up(&fib->event_wait);
|
||||
spin_unlock_irqrestore(&fib->event_lock, flagv);
|
||||
schedule();
|
||||
retval = 0;
|
||||
}
|
||||
}
|
||||
/* Give some extra time for ioctls to complete. */
|
||||
if (retval == 0)
|
||||
ssleep(2);
|
||||
index = aac->cardtype;
|
||||
|
||||
/*
|
||||
@@ -1248,7 +1230,7 @@ int aac_check_health(struct aac_dev * aac)
|
||||
|
||||
memset(hw_fib, 0, sizeof(struct hw_fib));
|
||||
memset(fib, 0, sizeof(struct fib));
|
||||
fib->hw_fib = hw_fib;
|
||||
fib->hw_fib_va = hw_fib;
|
||||
fib->dev = aac;
|
||||
aac_fib_init(fib);
|
||||
fib->type = FSAFS_NTC_FIB_CONTEXT;
|
||||
@@ -1354,11 +1336,11 @@ int aac_command_thread(void *data)
|
||||
* do anything at this point since we don't have
|
||||
* anything defined for this thread to do.
|
||||
*/
|
||||
hw_fib = fib->hw_fib;
|
||||
hw_fib = fib->hw_fib_va;
|
||||
memset(fib, 0, sizeof(struct fib));
|
||||
fib->type = FSAFS_NTC_FIB_CONTEXT;
|
||||
fib->size = sizeof( struct fib );
|
||||
fib->hw_fib = hw_fib;
|
||||
fib->hw_fib_va = hw_fib;
|
||||
fib->data = hw_fib->data;
|
||||
fib->dev = dev;
|
||||
/*
|
||||
@@ -1485,7 +1467,7 @@ int aac_command_thread(void *data)
|
||||
*/
|
||||
memcpy(hw_newfib, hw_fib, sizeof(struct hw_fib));
|
||||
memcpy(newfib, fib, sizeof(struct fib));
|
||||
newfib->hw_fib = hw_newfib;
|
||||
newfib->hw_fib_va = hw_newfib;
|
||||
/*
|
||||
* Put the FIB onto the
|
||||
* fibctx's fibs
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* based on the old aacraid driver that is..
|
||||
* Adaptec aacraid device driver for Linux.
|
||||
*
|
||||
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
* Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -72,7 +72,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
|
||||
u32 index = le32_to_cpu(entry->addr);
|
||||
fast = index & 0x01;
|
||||
fib = &dev->fibs[index >> 2];
|
||||
hwfib = fib->hw_fib;
|
||||
hwfib = fib->hw_fib_va;
|
||||
|
||||
aac_consumer_free(dev, q, HostNormRespQueue);
|
||||
/*
|
||||
@@ -83,11 +83,13 @@ unsigned int aac_response_normal(struct aac_queue * q)
|
||||
* continue. The caller has already been notified that
|
||||
* the fib timed out.
|
||||
*/
|
||||
if (!(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT))
|
||||
dev->queues->queue[AdapNormCmdQueue].numpending--;
|
||||
else {
|
||||
printk(KERN_WARNING "aacraid: FIB timeout (%x).\n", fib->flags);
|
||||
printk(KERN_DEBUG"aacraid: hwfib=%p fib index=%i fib=%p\n",hwfib, hwfib->header.SenderData,fib);
|
||||
dev->queues->queue[AdapNormCmdQueue].numpending--;
|
||||
|
||||
if (unlikely(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) {
|
||||
spin_unlock_irqrestore(q->lock, flags);
|
||||
aac_fib_complete(fib);
|
||||
aac_fib_free(fib);
|
||||
spin_lock_irqsave(q->lock, flags);
|
||||
continue;
|
||||
}
|
||||
spin_unlock_irqrestore(q->lock, flags);
|
||||
@@ -192,7 +194,7 @@ unsigned int aac_command_normal(struct aac_queue *q)
|
||||
INIT_LIST_HEAD(&fib->fiblink);
|
||||
fib->type = FSAFS_NTC_FIB_CONTEXT;
|
||||
fib->size = sizeof(struct fib);
|
||||
fib->hw_fib = hw_fib;
|
||||
fib->hw_fib_va = hw_fib;
|
||||
fib->data = hw_fib->data;
|
||||
fib->dev = dev;
|
||||
|
||||
@@ -253,12 +255,13 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index)
|
||||
return 1;
|
||||
}
|
||||
memset(hw_fib, 0, sizeof(struct hw_fib));
|
||||
memcpy(hw_fib, (struct hw_fib *)(((unsigned long)(dev->regs.sa)) + (index & ~0x00000002L)), sizeof(struct hw_fib));
|
||||
memcpy(hw_fib, (struct hw_fib *)(((ptrdiff_t)(dev->regs.sa)) +
|
||||
(index & ~0x00000002L)), sizeof(struct hw_fib));
|
||||
memset(fib, 0, sizeof(struct fib));
|
||||
INIT_LIST_HEAD(&fib->fiblink);
|
||||
fib->type = FSAFS_NTC_FIB_CONTEXT;
|
||||
fib->size = sizeof(struct fib);
|
||||
fib->hw_fib = hw_fib;
|
||||
fib->hw_fib_va = hw_fib;
|
||||
fib->data = hw_fib->data;
|
||||
fib->dev = dev;
|
||||
|
||||
@@ -270,7 +273,7 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index)
|
||||
} else {
|
||||
int fast = index & 0x01;
|
||||
struct fib * fib = &dev->fibs[index >> 2];
|
||||
struct hw_fib * hwfib = fib->hw_fib;
|
||||
struct hw_fib * hwfib = fib->hw_fib_va;
|
||||
|
||||
/*
|
||||
* Remove this fib from the Outstanding I/O queue.
|
||||
@@ -280,14 +283,14 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index)
|
||||
* continue. The caller has already been notified that
|
||||
* the fib timed out.
|
||||
*/
|
||||
if ((fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) {
|
||||
printk(KERN_WARNING "aacraid: FIB timeout (%x).\n", fib->flags);
|
||||
printk(KERN_DEBUG"aacraid: hwfib=%p index=%i fib=%p\n",hwfib, hwfib->header.SenderData,fib);
|
||||
dev->queues->queue[AdapNormCmdQueue].numpending--;
|
||||
|
||||
if (unlikely(fib->flags & FIB_CONTEXT_FLAG_TIMED_OUT)) {
|
||||
aac_fib_complete(fib);
|
||||
aac_fib_free(fib);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev->queues->queue[AdapNormCmdQueue].numpending--;
|
||||
|
||||
if (fast) {
|
||||
/*
|
||||
* Doctor the fib
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user