Commit 4c244d1a authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://linux-scsi.bkbits.net/scsi-for-linus-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 821bc517 77340725
......@@ -155,7 +155,6 @@ static MPT_EVHANDLER MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];
static MPT_RESETHANDLER MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS];
static struct mpt_pci_driver *MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS];
static int FusionInitCalled = 0;
static int mpt_base_index = -1;
static int last_drv_idx = -1;
......@@ -337,15 +336,13 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
ioc_stat = le16_to_cpu(mr->u.reply.IOCStatus);
if (ioc_stat & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
u32 log_info = le32_to_cpu(mr->u.reply.IOCLogInfo);
if ((int)ioc->chip_type <= (int)FC929)
if (ioc->bus_type == FC)
mpt_fc_log_info(ioc, log_info);
else
else if (ioc->bus_type == SCSI)
mpt_sp_log_info(ioc, log_info);
}
if (ioc_stat & MPI_IOCSTATUS_MASK) {
if ((int)ioc->chip_type <= (int)FC929)
;
else
if (ioc->bus_type == SCSI)
mpt_sp_ioc_info(ioc, (u32)ioc_stat, mf);
}
} else {
......@@ -392,7 +389,7 @@ mpt_interrupt(int irq, void *bus_id, struct pt_regs *r)
}
#ifdef MPT_DEBUG_IRQ
if ((int)ioc->chip_type > (int)FC929) {
if (ioc->bus_type == SCSI) {
/* Verify mf, mr are reasonable.
*/
if ((mf) && ((mf >= MPT_INDEX_2_MFPTR(ioc, ioc->req_depth))
......@@ -603,22 +600,6 @@ mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)
last_drv_idx = -1;
#ifndef MODULE
/*
* Handle possibility of the mptscsih_detect() routine getting
* called *before* fusion_init!
*/
if (!FusionInitCalled) {
dprintk((KERN_INFO MYNAM ": Hmmm, calling fusion_init from mpt_register!\n"));
/*
* NOTE! We'll get recursion here, as fusion_init()
* calls mpt_register()!
*/
fusion_init();
FusionInitCalled++;
}
#endif
/*
* Search for empty callback slot in this order: {N,...,7,6,5,...,1}
* (slot/handle 0 is reserved!)
......@@ -1220,22 +1201,21 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ioc->pio_chip = (SYSIF_REGS __iomem *)pmem;
}
ioc->chip_type = FCUNK;
if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC909) {
ioc->chip_type = FC909;
ioc->prod_name = "LSIFC909";
ioc->bus_type = FC;
}
if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC929) {
ioc->chip_type = FC929;
ioc->prod_name = "LSIFC929";
ioc->bus_type = FC;
}
else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC919) {
ioc->chip_type = FC919;
ioc->prod_name = "LSIFC919";
ioc->bus_type = FC;
}
else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC929X) {
ioc->chip_type = FC929X;
pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
ioc->bus_type = FC;
if (revision < XL_929) {
ioc->prod_name = "LSIFC929X";
/* 929X Chip Fix. Set Split transactions level
......@@ -1254,8 +1234,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
}
else if (pdev->device == MPI_MANUFACTPAGE_DEVICEID_FC919X) {
ioc->chip_type = FC919X;
ioc->prod_name = "LSIFC919X";
ioc->bus_type = FC;
/* 919X Chip Fix. Set Split transactions level
* for PCIX. Set MOST bits to zero.
*/
......@@ -1264,8 +1244,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_write_config_byte(pdev, 0x6a, pcixcmd);
}
else if (pdev->device == MPI_MANUFACTPAGE_DEVID_53C1030) {
ioc->chip_type = C1030;
ioc->prod_name = "LSI53C1030";
ioc->bus_type = SCSI;
/* 1030 Chip Fix. Disable Split transactions
* for PCIX. Set MOST bits to zero if Rev < C0( = 8).
*/
......@@ -1277,8 +1257,8 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
}
}
else if (pdev->device == MPI_MANUFACTPAGE_DEVID_1030_53C1035) {
ioc->chip_type = C1035;
ioc->prod_name = "LSI53C1035";
ioc->bus_type = SCSI;
}
sprintf(ioc->name, "ioc%d", ioc->id);
......@@ -1326,9 +1306,7 @@ mptbase_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/* NEW! 20010220 -sralston
* Check for "bound ports" (929, 929X, 1030, 1035) to reduce redundant resets.
*/
if ((ioc->chip_type == FC929) || (ioc->chip_type == C1030)
|| (ioc->chip_type == C1035) || (ioc->chip_type == FC929X))
mpt_detect_bound_ports(ioc, pdev);
mpt_detect_bound_ports(ioc, pdev);
if ((r = mpt_do_ioc_recovery(ioc,
MPT_HOSTEVENT_IOC_BRINGUP, CAN_SLEEP)) != 0) {
......@@ -1760,7 +1738,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
* and we try GetLanConfigPages again...
*/
if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) {
if ((int)ioc->chip_type <= (int)FC929) {
if (ioc->bus_type == FC) {
/*
* Pre-fetch FC port WWN and stuff...
* (FCPortPage0_t stuff)
......@@ -2103,20 +2081,8 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
}
/* Is it already READY? */
if (!statefault && (ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_READY) {
if ((int)ioc->chip_type <= (int)FC929)
return 0;
else {
return 0;
/* Workaround from broken 1030 FW.
* Force a diagnostic reset if fails.
*/
/* if ((r = SendIocReset(ioc, MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET, sleepFlag)) == 0)
return 0;
else
statefault = 4; */
}
}
if (!statefault && (ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_READY)
return 0;
/*
* Check to see if IOC is in FAULT state.
......@@ -2513,11 +2479,11 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
ddlprintk((MYIOC_s_INFO_FMT "upload_fw %d facts.Flags=%x\n",
ioc->name, ioc->upload_fw, ioc->facts.Flags));
if ((int)ioc->chip_type <= (int)FC929) {
if (ioc->bus_type == FC)
ioc_init.MaxDevices = MPT_MAX_FC_DEVICES;
} else {
else
ioc_init.MaxDevices = MPT_MAX_SCSI_DEVICES;
}
ioc_init.MaxBuses = MPT_MAX_BUS;
ioc_init.ReplyFrameSize = cpu_to_le16(ioc->reply_sz); /* in BYTES */
......@@ -2622,7 +2588,7 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
/* RAID FW may take a long time to enable
*/
if ((int)ioc->chip_type <= (int)FC929) {
if (ioc->bus_type == FC) {
ii = mpt_handshake_req_reply_wait(ioc, req_sz, (u32*)&port_enable,
reply_sz, (u16*)&reply_buf, 65 /*seconds*/, sleepFlag);
} else {
......@@ -2992,7 +2958,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
int cnt,cntdn;
dinitprintk((KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name));
if ((int)ioc->chip_type > (int)FC929) {
if (ioc->bus_type == SCSI) {
/* Always issue a Msg Unit Reset first. This will clear some
* SCSI bus hang conditions.
*/
......@@ -3420,7 +3386,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
dinitprintk((KERN_INFO MYNAM ": %s Now numSGE=%d num_sge=%d num_chain=%d\n",
ioc->name, numSGE, num_sge, num_chain));
if ((int) ioc->chip_type > (int) FC929)
if (ioc->bus_type == SCSI)
num_chain *= MPT_SCSI_CAN_QUEUE;
else
num_chain *= MPT_FC_CAN_QUEUE;
......@@ -5277,7 +5243,7 @@ procmpt_iocinfo_read(char *buf, char **start, off_t offset, int request, int *eo
len += sprintf(buf+len, " PortNumber = %d (of %d)\n",
p+1,
ioc->facts.NumberOfPorts);
if ((int)ioc->chip_type <= (int)FC929) {
if (ioc->bus_type == FC) {
if (ioc->pfacts[p].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) {
u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
len += sprintf(buf+len, " LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n",
......@@ -5921,11 +5887,6 @@ fusion_init(void)
int i;
int r;
if (FusionInitCalled++) {
dprintk((KERN_INFO MYNAM ": INFO - Driver late-init entry point called\n"));
return 0;
}
show_mptmod_ver(my_NAME, my_VERSION);
printk(KERN_INFO COPYRIGHT "\n");
......
......@@ -83,8 +83,8 @@
#define COPYRIGHT "Copyright (c) 1999-2004 " MODULEAUTHOR
#endif
#define MPT_LINUX_VERSION_COMMON "3.01.17"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.01.17"
#define MPT_LINUX_VERSION_COMMON "3.01.18"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.01.18"
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
#define show_mptmod_ver(s,ver) \
......@@ -296,23 +296,6 @@ typedef struct _MPT_SGL64_HDR {
SGESimple64_t sge[1];
} MPT_SGL64_HDR;
/*
* Chip-specific stuff... FC929 delineates break between
* FC and Parallel SCSI parts. Do NOT re-order.
*/
typedef enum {
FC919X = 0x0819,
FC929X = 0x0829,
FC909 = 0x0909,
FC919 = 0x0919,
FC929 = 0x0929,
C1030 = 0x1030,
C1035 = 0x1035,
FCUNK = 0xFBAD
} CHIP_TYPE;
/*
* System interface register set
*/
......@@ -517,6 +500,7 @@ typedef struct _MPT_ADAPTER
char *prod_name; /* "LSIFC9x9" */
SYSIF_REGS __iomem *chip; /* == c8817000 (mmap) */
SYSIF_REGS __iomem *pio_chip; /* Programmed IO (downloadboot) */
u8 bus_type;
u32 mem_phys; /* == f4020000 (mmap) */
u32 pio_mem_phys; /* Programmed IO (downloadboot) */
int mem_size; /* mmap memory size */
......@@ -543,7 +527,6 @@ typedef struct _MPT_ADAPTER
dma_addr_t ChainBufferDMA;
struct list_head FreeChainQ;
spinlock_t FreeChainQlock;
CHIP_TYPE chip_type;
/* We (host driver) get to manage our own RequestQueue! */
dma_addr_t req_frames_dma;
MPT_FRAME_HDR *req_frames; /* Request msg frames - rounded up! */
......@@ -573,12 +556,6 @@ typedef struct _MPT_ADAPTER
int eventTypes; /* Event logging parameters */
int eventContext; /* Next event context */
int eventLogSize; /* Max number of cached events */
#ifdef MPTSCSIH_DBG_TIMEOUT
int timeout_hard;
int timeout_delta;
int timeout_cnt;
int timeout_maxcnt;
#endif
struct _mpt_ioctl_events *events; /* pointer to event log */
u8 *cached_fw; /* Pointer to FW */
dma_addr_t cached_fw_dma;
......@@ -894,6 +871,12 @@ typedef struct _MPT_LOCAL_REPLY {
#define TM_STATE_IN_PROGRESS (1)
#define TM_STATE_ERROR (2)
typedef enum {
FC,
SCSI,
SAS
} BUS_TYPE;
typedef struct _MPT_SCSI_HOST {
MPT_ADAPTER *ioc;
int port;
......@@ -909,7 +892,6 @@ typedef struct _MPT_SCSI_HOST {
*/
u8 tmPending;
u8 resetPending;
u8 is_spi; /* Parallel SCSI i/f */
u8 negoNvram; /* DV disabled, nego NVRAM */
u8 pad1;
u8 tmState;
......
......@@ -1218,7 +1218,7 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
/* Fill in the data and return the structure to the calling
* program
*/
if ((int)ioc->chip_type <= (int) FC929)
if (ioc->bus_type == FC)
karg->adapterType = MPT_IOCTL_INTERFACE_FC;
else
karg->adapterType = MPT_IOCTL_INTERFACE_SCSI;
......@@ -1518,7 +1518,7 @@ mptctl_readtest (unsigned long arg)
#ifdef MFCNT
karg.chip_type = ioc->mfcnt;
#else
karg.chip_type = ioc->chip_type;
karg.chip_type = ioc->pcidev->device;
#endif
strncpy (karg.name, ioc->name, MPT_MAX_NAME);
karg.name[MPT_MAX_NAME-1]='\0';
......@@ -2470,7 +2470,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
karg.base_io_addr = pci_resource_start(pdev, 0);
if ((int)ioc->chip_type <= (int) FC929)
if (ioc->bus_type == FC)
karg.bus_phys_width = HP_BUS_WIDTH_UNK;
else
karg.bus_phys_width = HP_BUS_WIDTH_16;
......@@ -2559,7 +2559,7 @@ mptctl_hp_targetinfo(unsigned long arg)
/* There is nothing to do for FCP parts.
*/
if ((int) ioc->chip_type <= (int) FC929)
if (ioc->bus_type == FC)
return 0;
if ((ioc->spi_data.sdp0length == 0) || (ioc->sh == NULL))
......
This diff is collapsed.
......@@ -95,17 +95,8 @@ struct mptscsih_driver_setup
{
u8 dv;
u8 max_width;
u8 min_sync_fac;
u8 min_sync_factor;
u8 saf_te;
};
#define MPTSCSIH_DRIVER_SETUP \
{ \
MPTSCSIH_DOMAIN_VALIDATION, \
MPTSCSIH_MAX_WIDTH, \
MPTSCSIH_MIN_SYNC, \
MPTSCSIH_SAF_TE, \
}
#endif
......@@ -34,8 +34,7 @@
#ifndef ZFCP_DEF_H
#define ZFCP_DEF_H
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_DEF_REVISION "$Revision: 1.110 $"
#define ZFCP_DEF_REVISION "$Revision: 1.111 $"
/*************************** INCLUDES *****************************************/
......@@ -70,6 +69,7 @@
/********************* GENERAL DEFINES *********************************/
/* zfcp version number, it consists of major, minor, and patch-level number */
#define ZFCP_VERSION "4.2.0"
/**
......
......@@ -31,8 +31,7 @@
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_ERP_REVISION "$Revision: 1.83 $"
#define ZFCP_ERP_REVISION "$Revision: 1.85 $"
#include "zfcp_ext.h"
......@@ -3482,9 +3481,8 @@ zfcp_erp_port_access_denied(struct zfcp_port *port)
debug_text_event(adapter->erp_dbf, 3, "p_access_block");
debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
read_lock_irqsave(&zfcp_data.config_lock, flags);
zfcp_erp_modify_port_status(port,
ZFCP_STATUS_COMMON_ERP_FAILED | ZFCP_STATUS_COMMON_ACCESS_DENIED,
ZFCP_SET);
zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED |
ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
read_unlock_irqrestore(&zfcp_data.config_lock, flags);
}
......@@ -3500,9 +3498,8 @@ zfcp_erp_unit_access_denied(struct zfcp_unit *unit)
debug_text_event(adapter->erp_dbf, 3, "u_access_block");
debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
zfcp_erp_modify_unit_status(unit,
ZFCP_STATUS_COMMON_ERP_FAILED | ZFCP_STATUS_COMMON_ACCESS_DENIED,
ZFCP_SET);
zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_ERP_FAILED |
ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
}
/*
......@@ -3541,19 +3538,21 @@ zfcp_erp_port_access_changed(struct zfcp_port *port)
debug_text_event(adapter->erp_dbf, 3, "p_access_unblock");
debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &port->status)) {
if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
&port->status)) {
if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
list_for_each_entry(unit, &port->unit_list_head, list)
zfcp_erp_unit_access_changed(unit);
return;
}
ZFCP_LOG_NORMAL("Trying to reopen port 0x%016Lx on adapter %s "
"due to update to access control table\n",
ZFCP_LOG_NORMAL("reopen of port 0x%016Lx on adapter %s "
"(due to ACT update)\n",
port->wwpn, zfcp_get_busid_by_adapter(adapter));
if (zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
ZFCP_LOG_NORMAL("Reopen of port 0x%016Lx on adapter %s failed\n",
port->wwpn, zfcp_get_busid_by_adapter(adapter));
ZFCP_LOG_NORMAL("failed reopen of port"
"(adapter %s, wwpn=0x%016Lx)\n",
zfcp_get_busid_by_adapter(adapter), port->wwpn);
}
/*
......@@ -3572,16 +3571,15 @@ zfcp_erp_unit_access_changed(struct zfcp_unit *unit)
if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &unit->status))
return;
ZFCP_LOG_NORMAL("Trying to reopen unit 0x%016Lx "
"on port 0x%016Lx on adapter %s "
"due to update to access control table\n",
ZFCP_LOG_NORMAL("reopen of unit 0x%016Lx on port 0x%016Lx "
" on adapter %s (due to ACT update)\n",
unit->fcp_lun, unit->port->wwpn,
zfcp_get_busid_by_adapter(adapter));
if (zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
ZFCP_LOG_NORMAL("Reopen of unit 0x%016Lx "
"on port 0x%016Lx on adapter %s failed\n",
unit->fcp_lun, unit->port->wwpn,
zfcp_get_busid_by_adapter(adapter));
ZFCP_LOG_NORMAL("failed reopen of unit (adapter %s, "
"wwpn=0x%016Lx, fcp_lun=0x%016Lx)\n",
zfcp_get_busid_by_adapter(adapter),
unit->port->wwpn, unit->fcp_lun);
}
#undef ZFCP_LOG_AREA
......@@ -31,8 +31,8 @@
#ifndef ZFCP_EXT_H
#define ZFCP_EXT_H
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_EXT_REVISION "$Revision: 1.61 $"
#define ZFCP_EXT_REVISION "$Revision: 1.62 $"
#include "zfcp_def.h"
......
......@@ -30,8 +30,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_FSF_C_REVISION "$Revision: 1.86 $"
#define ZFCP_FSF_C_REVISION "$Revision: 1.88 $"
#include "zfcp_ext.h"
......@@ -1737,7 +1736,7 @@ zfcp_fsf_send_els(struct zfcp_send_els *els)
adapter = els->adapter;
ret = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
ZFCP_WAIT_FOR_SBAL|ZFCP_REQ_AUTO_CLEANUP,
ZFCP_REQ_AUTO_CLEANUP,
NULL, &lock_flags, &fsf_req);
if (ret < 0) {
ZFCP_LOG_INFO("error: creation of ELS request failed "
......@@ -3094,57 +3093,11 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
exclusive = bottom->lun_access_info & FSF_UNIT_ACCESS_EXCLUSIVE;
readwrite = bottom->lun_access_info & FSF_UNIT_ACCESS_OUTBOUND_TRANSFER;
if (!adapter->supported_features & FSF_FEATURE_CFDC)
goto no_cfdc;
atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
ZFCP_STATUS_UNIT_SHARED |
ZFCP_STATUS_UNIT_READONLY,
&unit->status);
if (!allowed)
atomic_set_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &unit->status);
if (!adapter->supported_features & FSF_FEATURE_LUN_SHARING)
goto no_lun_sharing;
if (!exclusive)
atomic_set_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status);
if (!readwrite) {
atomic_set_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status);
ZFCP_LOG_NORMAL("Unit 0x%016Lx on port 0x%016Lx on adapter %s "
"accessed read-only\n", unit->fcp_lun,
unit->port->wwpn, zfcp_get_busid_by_unit(unit));
}
if (exclusive && !readwrite) {
ZFCP_LOG_NORMAL("Exclusive access of read-only unit not "
"supported\n");
zfcp_erp_unit_failed(unit);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
goto skip_fsfstatus;
}
if (!exclusive && readwrite) {
ZFCP_LOG_NORMAL("Shared access of read-write unit is not "
"supported\n");
zfcp_erp_unit_failed(unit);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
goto skip_fsfstatus;
}
no_lun_sharing:
no_cfdc:
if (!(adapter->supported_features & FSF_FEATURE_CFDC) &&
(adapter->supported_features & FSF_FEATURE_LUN_SHARING)) {
ZFCP_LOG_NORMAL("LUN sharing without access control is not "
"supported.\n");
zfcp_erp_unit_failed(unit);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
goto skip_fsfstatus;
}
/* evaluate FSF status in QTCB */
switch (header->fsf_status) {
......@@ -3196,6 +3149,8 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
}
debug_text_event(adapter->erp_dbf, 1, "fsf_s_access");
zfcp_erp_unit_access_denied(unit);
atomic_clear_mask(ZFCP_STATUS_UNIT_SHARED, &unit->status);
atomic_clear_mask(ZFCP_STATUS_UNIT_READONLY, &unit->status);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break;
......
......@@ -31,8 +31,7 @@
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI
/* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_SCSI_REVISION "$Revision: 1.73 $"
#define ZFCP_SCSI_REVISION "$Revision: 1.74 $"
#include "zfcp_ext.h"
......
......@@ -1767,7 +1767,7 @@ config SCSI_SUNESP
config ZFCP
tristate "FCP host bus adapter driver for IBM eServer zSeries"
depends on ARCH_S390 && SCSI
depends on ARCH_S390 && QDIO && SCSI
select SCSI_FC_ATTRS
help
If you want to access SCSI devices attached to your IBM eServer
......
......@@ -645,9 +645,31 @@ int aac_get_adapter_info(struct aac_dev* dev)
dev->adapter_info.serial[1]);
dev->nondasd_support = 0;
dev->raid_scsi_mode = 0;
if(dev->adapter_info.options & AAC_OPT_NONDASD){
dev->nondasd_support = 1;
}
/*
* If the firmware supports ROMB RAID/SCSI mode and we are currently
* in RAID/SCSI mode, set the flag. For now if in this mode we will
* force nondasd support on. If we decide to allow the non-dasd flag
* additional changes changes will have to be made to support
* RAID/SCSI. the function aac_scsi_cmd in this module will have to be
* changed to support the new dev->raid_scsi_mode flag instead of
* leaching off of the dev->nondasd_support flag. Also in linit.c the
* function aac_detect will have to be modified where it sets up the
* max number of channels based on the aac->nondasd_support flag only.
*/
if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) &&
(dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) {
dev->nondasd_support = 1;
dev->raid_scsi_mode = 1;
}
if (dev->raid_scsi_mode != 0)
printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n",
dev->name, dev->id);
if(nondasd != -1) {
dev->nondasd_support = (nondasd!=0);
}
......@@ -1137,7 +1159,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
char *cp;
dprintk((KERN_DEBUG "READ CAPACITY command.\n"));
if (fsa_dev_ptr[cid].size <= 0x100000000)
if (fsa_dev_ptr[cid].size <= 0x100000000LL)
capacity = fsa_dev_ptr[cid].size - 1;
else
capacity = (u32)-1;
......@@ -1446,8 +1468,17 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
if( b==TYPE_TAPE || b==TYPE_WORM || b==TYPE_ROM || b==TYPE_MOD|| b==TYPE_MEDIUM_CHANGER
|| (b==TYPE_DISK && (b1&0x80)) ){
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
/*
* We will allow disk devices if in RAID/SCSI mode and
* the channel is 2
*/
} else if ((dev->raid_scsi_mode) &&
(scsicmd->device->channel == 2)) {
scsicmd->result = DID_OK << 16 |
COMMAND_COMPLETE << 8;
} else {
scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
scsicmd->result = DID_NO_CONNECT << 16 |
COMMAND_COMPLETE << 8;
}
} else {
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
......@@ -1479,8 +1510,17 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
if( b==TYPE_TAPE || b==TYPE_WORM || b==TYPE_ROM || b==TYPE_MOD|| b==TYPE_MEDIUM_CHANGER
|| (b==TYPE_DISK && (b1&0x80)) ){
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
/*
* We will allow disk devices if in RAID/SCSI mode and
* the channel is 2
*/
} else if ((dev->raid_scsi_mode) &&
(scsicmd->device->channel == 2)) {
scsicmd->result = DID_OK << 16 |
COMMAND_COMPLETE << 8;
} else {
scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
scsicmd->result = DID_NO_CONNECT << 16 |
COMMAND_COMPLETE << 8;
}
break;
}
......
......@@ -805,6 +805,8 @@ struct aac_adapter_info
#define AAC_OPT_SGMAP_HOST64 cpu_to_le32(1<<10)
#define AAC_OPT_ALARM cpu_to_le32(1<<11)
#define AAC_OPT_NONDASD cpu_to_le32(1<<12)
#define AAC_OPT_SCSI_MANAGED cpu_to_le32(1<<13)
#define AAC_OPT_RAID_SCSI_MODE cpu_to_le32(1<<14)
struct aac_dev
{
......@@ -877,6 +879,7 @@ struct aac_dev
*/
u8 nondasd_support;
u8 dac_support;
u8 raid_scsi_mode;
};
#define aac_adapter_interrupt(dev) \
......
......@@ -540,7 +540,7 @@ struct ahd_platform_data {
uint32_t irq; /* IRQ for this adapter */
uint32_t bios_address;
uint32_t mem_busaddr; /* Mem Base Addr */
dma_addr_t hw_dma_mask;
uint64_t hw_dma_mask;
ahd_linux_softc_flags flags;
};
......
......@@ -170,24 +170,22 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (sizeof(dma_addr_t) > 4) {
uint64_t memsize;
dma_addr_t mask_64bit;
dma_addr_t mask_39bit;
const uint64_t mask_39bit = 0x7FFFFFFFFFULL;
memsize = ahd_linux_get_memsize();
mask_64bit = (dma_addr_t)0xFFFFFFFFFFFFFFFFULL;
mask_39bit = (dma_addr_t)0x7FFFFFFFFFULL;
if (memsize >= 0x8000000000ULL
&& pci_set_dma_mask(pdev, mask_64bit) == 0) {
&& pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
ahd->flags |= AHD_64BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = mask_64bit;
ahd->platform_data->hw_dma_mask = DMA_64BIT_MASK;
} else if (memsize > 0x80000000
&& pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahd->flags |= AHD_39BIT_ADDRESSING;
ahd->platform_data->hw_dma_mask = mask_39bit;
}
} else {
pci_set_dma_mask(pdev, 0xFFFFFFFF);
ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
pci_set_dma_mask(pdev, DMA_32BIT_MASK);
ahd->platform_data->hw_dma_mask = DMA_32BIT_MASK;
}
ahd->dev_softc = pci;
error = ahd_pci_config(ahd, entry);
......
......@@ -545,7 +545,7 @@ struct ahc_platform_data {
uint32_t irq; /* IRQ for this adapter */
uint32_t bios_address;
uint32_t mem_busaddr; /* Mem Base Addr */
dma_addr_t hw_dma_mask;
uint64_t hw_dma_mask;
ahc_linux_softc_flags flags;
};
......
......@@ -175,7 +175,7 @@ static int
ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
char buf[80];
dma_addr_t mask_39bit;
const uint64_t mask_39bit = 0x7FFFFFFFFFULL;
struct ahc_softc *ahc;
ahc_dev_softc_t pci;
struct ahc_pci_identity *entry;
......@@ -226,18 +226,17 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
}
pci_set_master(pdev);
mask_39bit = 0x7FFFFFFFFFULL;
if (sizeof(dma_addr_t) > 4
&& ahc_linux_get_memsize() > 0x80000000
&& pci_set_dma_mask(pdev, mask_39bit) == 0) {
ahc->flags |= AHC_39BIT_ADDRESSING;
ahc->platform_data->hw_dma_mask = mask_39bit;
} else {
if (pci_set_dma_mask(pdev, 0xFFFFFFFF)) {
if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
printk(KERN_WARNING "aic7xxx: No suitable DMA available.\n");
return (-ENODEV);
}
ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
ahc->platform_data->hw_dma_mask = DMA_32BIT_MASK;
}
#endif
ahc->dev_softc = pci;
......
......@@ -118,6 +118,7 @@ static struct {
* Other types of devices that have special flags.
* Note that all USB devices should have the BLIST_INQUIRY_36 flag.
*/
{"3PARdata", "VV", NULL, BLIST_REPORTLUN2},
{"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN},
{"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN},
{"AFT PRO", "-IX CF", "0.0>", BLIST_FORCELUN},
......
......@@ -728,7 +728,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes,
req->sense_len = len;
}
} else
req->data_len -= cmd->bufflen;
req->data_len = cmd->resid;
}
/*
......
......@@ -361,9 +361,8 @@ static ssize_t store_spi_host_signalling(struct class_device *cdev,
enum spi_signal_type type = spi_signal_to_value(buf);
if (type != SPI_SIGNAL_UNKNOWN)
return count;
i->f->set_signalling(shost, type);
i->f->set_signalling(shost, type);
return count;
}
static CLASS_DEVICE_ATTR(signalling, S_IRUGO | S_IWUSR,
......@@ -635,7 +634,11 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
/* OK, now we have our initial speed set by the read only inquiry
* test, now try an echo buffer test (if the device allows it) */
if ((len = spi_dv_device_get_echo_buffer(sreq, buffer)) == 0) {
len = 0;
if (sdev->ppr)
len = spi_dv_device_get_echo_buffer(sreq, buffer);
if (len == 0) {
SPI_PRINTK(sdev->sdev_target, KERN_INFO, "Domain Validation skipping write tests\n");
return;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment