SCSI misc on 20160517
This patch includes the usual quota of driver updates (bnx2fc, mp3sas, hpsa, ncr5380, lpfc, hisi_sas, snic, aacraid, megaraid_sas) there's also a multiqueue update for scsi_debug, assorted bug fixes and a few other minor updates (refactor of scsi_sg_pools into generic code, alua and VPD updates, and struct timeval conversions). Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABAgAGBQJXO8W0AAoJEDeqqVYsXL0MW24H/jGWwfjsDUiSsLwbLca6DWu8 ZCWZ7rSZ27CApwGPgZGpLvUg+vpW8Ykm2zdeBnlZ6ScXS+dT3uo/PHsnemsTextj 6glQNIOFY0Ja2GwkkN00M6IZQhTJ628cqJKIEJxC68lIw16wiOwjZaK68GMrusDO Sl062rkuLR6Jb2T+YoT/sD8jQfWlSj2V9e9rqJoS/rIbS6B+hUipuybz2yQ2yK2u XFc30yal9oVz1fHEoh2O8aqckW3/iskukVXVuZ0MQzT/lV/bm9I6AnWVHw7d0Yhp ZELjXpjx5M2Z/d8k0Wvx1e25oL/ERwa96yLnTvRcqyF5Yt1EgAhT+jKvo4pnGr8= =L6y/ -----END PGP SIGNATURE----- Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI updates from James Bottomley: "First round of SCSI updates for the 4.6+ merge window. This batch includes the usual quota of driver updates (bnx2fc, mp3sas, hpsa, ncr5380, lpfc, hisi_sas, snic, aacraid, megaraid_sas). There's also a multiqueue update for scsi_debug, assorted bug fixes and a few other minor updates (refactor of scsi_sg_pools into generic code, alua and VPD updates, and struct timeval conversions)" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (138 commits) mpt3sas: Used "synchronize_irq()"API to synchronize timed-out IO & TMs mpt3sas: Set maximum transfer length per IO to 4MB for VDs mpt3sas: Updating mpt3sas driver version to 13.100.00.00 mpt3sas: Fix initial Reference tag field for 4K PI drives. mpt3sas: Handle active cable exception event mpt3sas: Update MPI header to 2.00.42 Revert "lpfc: Delete unnecessary checks before the function call mempool_destroy" eata_pio: missing break statement hpsa: Fix type ZBC conditional checks scsi_lib: Decode T10 vendor IDs scsi_dh_alua: do not fail for unknown VPD identification scsi_debug: use locally assigned naa scsi_debug: uuid for lu name scsi_debug: vpd and mode page work scsi_debug: add multiple queue support bfa: fix bfa_fcb_itnim_alloc() error handling megaraid_sas: Downgrade two success messages to info cxlflash: Fix to resolve dead-lock during EEH recovery scsi_debug: rework resp_report_luns scsi_debug: use pdt constants ...
This commit is contained in:
commit
675e0655c1
117 changed files with 4839 additions and 6481 deletions
|
|
@ -23,11 +23,10 @@ supported by the driver.
|
|||
|
||||
If the default configuration does not work for you, you can use the kernel
|
||||
command lines (eg using the lilo append command):
|
||||
ncr5380=port,irq,dma
|
||||
ncr53c400=port,irq
|
||||
or
|
||||
ncr5380=base,irq,dma
|
||||
ncr53c400=base,irq
|
||||
ncr5380=addr,irq
|
||||
ncr53c400=addr,irq
|
||||
ncr53c400a=addr,irq
|
||||
dtc3181e=addr,irq
|
||||
|
||||
The driver does not probe for any addresses or ports other than those in
|
||||
the OVERRIDE or given to the kernel as above.
|
||||
|
|
@ -36,19 +35,17 @@ This driver provides some information on what it has detected in
|
|||
/proc/scsi/g_NCR5380/x where x is the scsi card number as detected at boot
|
||||
time. More info to come in the future.
|
||||
|
||||
When NCR53c400 support is compiled in, BIOS parameters will be returned by
|
||||
the driver (the raw 5380 driver does not and I don't plan to fiddle with
|
||||
it!).
|
||||
|
||||
This driver works as a module.
|
||||
When included as a module, parameters can be passed on the insmod/modprobe
|
||||
command line:
|
||||
ncr_irq=xx the interrupt
|
||||
ncr_addr=xx the port or base address (for port or memory
|
||||
mapped, resp.)
|
||||
ncr_dma=xx the DMA
|
||||
ncr_5380=1 to set up for a NCR5380 board
|
||||
ncr_53c400=1 to set up for a NCR53C400 board
|
||||
ncr_53c400a=1 to set up for a NCR53C400A board
|
||||
dtc_3181e=1 to set up for a Domex Technology Corp 3181E board
|
||||
hp_c2502=1 to set up for a Hewlett Packard C2502 board
|
||||
e.g.
|
||||
modprobe g_NCR5380 ncr_irq=5 ncr_addr=0x350 ncr_5380=1
|
||||
for a port mapped NCR5380 board or
|
||||
|
|
|
|||
|
|
@ -27,13 +27,15 @@ parameters may be changed at runtime by the command
|
|||
aic79xx= [HW,SCSI]
|
||||
See Documentation/scsi/aic79xx.txt.
|
||||
|
||||
atascsi= [HW,SCSI] Atari SCSI
|
||||
atascsi= [HW,SCSI]
|
||||
See drivers/scsi/atari_scsi.c.
|
||||
|
||||
BusLogic= [HW,SCSI]
|
||||
See drivers/scsi/BusLogic.c, comment before function
|
||||
BusLogic_ParseDriverOptions().
|
||||
|
||||
dtc3181e= [HW,SCSI]
|
||||
See Documentation/scsi/g_NCR5380.txt.
|
||||
|
||||
eata= [HW,SCSI]
|
||||
|
||||
|
|
@ -51,8 +53,8 @@ parameters may be changed at runtime by the command
|
|||
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
||||
See header of drivers/scsi/ips.c.
|
||||
|
||||
mac5380= [HW,SCSI] Format:
|
||||
<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||
mac5380= [HW,SCSI]
|
||||
See drivers/scsi/mac_scsi.c.
|
||||
|
||||
max_luns= [SCSI] Maximum number of LUNs to probe.
|
||||
Should be between 1 and 2^32-1.
|
||||
|
|
@ -65,10 +67,13 @@ parameters may be changed at runtime by the command
|
|||
See header of drivers/scsi/NCR_D700.c.
|
||||
|
||||
ncr5380= [HW,SCSI]
|
||||
See Documentation/scsi/g_NCR5380.txt.
|
||||
|
||||
ncr53c400= [HW,SCSI]
|
||||
See Documentation/scsi/g_NCR5380.txt.
|
||||
|
||||
ncr53c400a= [HW,SCSI]
|
||||
See Documentation/scsi/g_NCR5380.txt.
|
||||
|
||||
ncr53c406a= [HW,SCSI]
|
||||
|
||||
|
|
|
|||
|
|
@ -7593,10 +7593,10 @@ M: Michael Schmitz <schmitzmic@gmail.com>
|
|||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/scsi/g_NCR5380.txt
|
||||
F: Documentation/scsi/dtc3x80.txt
|
||||
F: drivers/scsi/NCR5380.*
|
||||
F: drivers/scsi/arm/cumana_1.c
|
||||
F: drivers/scsi/arm/oak.c
|
||||
F: drivers/scsi/atari_NCR5380.c
|
||||
F: drivers/scsi/atari_scsi.*
|
||||
F: drivers/scsi/dmx3191d.c
|
||||
F: drivers/scsi/dtc.*
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ static int icside_dma_init(struct pata_icside_info *info)
|
|||
|
||||
static struct scsi_host_template pata_icside_sht = {
|
||||
ATA_BASE_SHT(DRV_NAME),
|
||||
.sg_tablesize = SCSI_MAX_SG_CHAIN_SEGMENTS,
|
||||
.sg_tablesize = SG_MAX_SEGMENTS,
|
||||
.dma_boundary = IOMD_DMA_BOUNDARY,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ MODULE_PARM_DESC(cmd_sg_entries,
|
|||
|
||||
module_param(indirect_sg_entries, uint, 0444);
|
||||
MODULE_PARM_DESC(indirect_sg_entries,
|
||||
"Default max number of gather/scatter entries (default is 12, max is " __stringify(SCSI_MAX_SG_CHAIN_SEGMENTS) ")");
|
||||
"Default max number of gather/scatter entries (default is 12, max is " __stringify(SG_MAX_SEGMENTS) ")");
|
||||
|
||||
module_param(allow_ext_sg, bool, 0444);
|
||||
MODULE_PARM_DESC(allow_ext_sg,
|
||||
|
|
@ -2819,7 +2819,7 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
|
|||
spin_unlock(&host->target_lock);
|
||||
|
||||
scsi_scan_target(&target->scsi_host->shost_gendev,
|
||||
0, target->scsi_id, SCAN_WILD_CARD, 0);
|
||||
0, target->scsi_id, SCAN_WILD_CARD, SCSI_SCAN_INITIAL);
|
||||
|
||||
if (srp_connected_ch(target) < target->ch_count ||
|
||||
target->qp_in_error) {
|
||||
|
|
@ -3097,7 +3097,7 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
|
|||
|
||||
case SRP_OPT_SG_TABLESIZE:
|
||||
if (match_int(args, &token) || token < 1 ||
|
||||
token > SCSI_MAX_SG_CHAIN_SEGMENTS) {
|
||||
token > SG_MAX_SEGMENTS) {
|
||||
pr_warn("bad max sg_tablesize parameter '%s'\n",
|
||||
p);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -2281,7 +2281,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
|
||||
dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio),
|
||||
blk_rq_bytes(req), PCI_DMA_BIDIRECTIONAL);
|
||||
if (!dma_addr_out)
|
||||
if (pci_dma_mapping_error(ioc->pcidev, dma_addr_out))
|
||||
goto put_mf;
|
||||
ioc->add_sge(psge, flagsLength, dma_addr_out);
|
||||
psge += ioc->SGE_size;
|
||||
|
|
@ -2296,7 +2296,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
flagsLength |= blk_rq_bytes(rsp) + 4;
|
||||
dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio),
|
||||
blk_rq_bytes(rsp), PCI_DMA_BIDIRECTIONAL);
|
||||
if (!dma_addr_in)
|
||||
if (pci_dma_mapping_error(ioc->pcidev, dma_addr_in))
|
||||
goto unmap;
|
||||
ioc->add_sge(psge, flagsLength, dma_addr_in);
|
||||
|
||||
|
|
|
|||
|
|
@ -1150,7 +1150,7 @@ static void mpt_work_wrapper(struct work_struct *work)
|
|||
}
|
||||
shost_printk(KERN_INFO, shost, MYIOC_s_FMT
|
||||
"Integrated RAID detects new device %d\n", ioc->name, disk);
|
||||
scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, 1);
|
||||
scsi_scan_target(&ioc->sh->shost_gendev, 1, disk, 0, SCSI_SCAN_RESCAN);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,8 @@ void zfcp_unit_scsi_scan(struct zfcp_unit *unit)
|
|||
lun = scsilun_to_int((struct scsi_lun *) &unit->fcp_lun);
|
||||
|
||||
if (rport && rport->port_state == FC_PORTSTATE_ONLINE)
|
||||
scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, lun, 1);
|
||||
scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, lun,
|
||||
SCSI_SCAN_MANUAL);
|
||||
}
|
||||
|
||||
static void zfcp_unit_scsi_scan_work(struct work_struct *work)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ config SCSI
|
|||
tristate "SCSI device support"
|
||||
depends on BLOCK
|
||||
select SCSI_DMA if HAS_DMA
|
||||
select SG_POOL
|
||||
---help---
|
||||
If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
|
||||
any other SCSI device under Linux, say Y and make sure that you know
|
||||
|
|
@ -202,12 +203,12 @@ config SCSI_ENCLOSURE
|
|||
certain enclosure conditions to be reported and is not required.
|
||||
|
||||
config SCSI_CONSTANTS
|
||||
bool "Verbose SCSI error reporting (kernel size +=75K)"
|
||||
bool "Verbose SCSI error reporting (kernel size += 36K)"
|
||||
depends on SCSI
|
||||
help
|
||||
The error messages regarding your SCSI hardware will be easier to
|
||||
understand if you say Y here; it will enlarge your kernel by about
|
||||
75 KB. If in doubt, say Y.
|
||||
36 KB. If in doubt, say Y.
|
||||
|
||||
config SCSI_LOGGING
|
||||
bool "SCSI logging facility"
|
||||
|
|
@ -813,17 +814,6 @@ config SCSI_GENERIC_NCR5380_MMIO
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called g_NCR5380_mmio.
|
||||
|
||||
config SCSI_GENERIC_NCR53C400
|
||||
bool "Enable NCR53c400 extensions"
|
||||
depends on SCSI_GENERIC_NCR5380
|
||||
help
|
||||
This enables certain optimizations for the NCR53c400 SCSI cards.
|
||||
You might as well try it out. Note that this driver will only probe
|
||||
for the Trantor T130B in its default configuration; you might have
|
||||
to pass a command line option to the kernel at boot time if it does
|
||||
not detect your card. See the file
|
||||
<file:Documentation/scsi/g_NCR5380.txt> for details.
|
||||
|
||||
config SCSI_IPS
|
||||
tristate "IBM ServeRAID support"
|
||||
depends on PCI && SCSI
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -199,13 +199,6 @@
|
|||
|
||||
#define PHASE_SR_TO_TCR(phase) ((phase) >> 2)
|
||||
|
||||
/*
|
||||
* "Special" value for the (unsigned char) command tag, to indicate
|
||||
* I_T_L nexus instead of I_T_L_Q.
|
||||
*/
|
||||
|
||||
#define TAG_NONE 0xff
|
||||
|
||||
/*
|
||||
* These are "special" values for the irq and dma_channel fields of the
|
||||
* Scsi_Host structure
|
||||
|
|
@ -220,28 +213,17 @@
|
|||
#define NO_IRQ 0
|
||||
#endif
|
||||
|
||||
#define FLAG_NO_DMA_FIXUP 1 /* No DMA errata workarounds */
|
||||
#define FLAG_DMA_FIXUP 1 /* Use DMA errata workarounds */
|
||||
#define FLAG_NO_PSEUDO_DMA 8 /* Inhibit DMA */
|
||||
#define FLAG_LATE_DMA_SETUP 32 /* Setup NCR before DMA H/W */
|
||||
#define FLAG_TAGGED_QUEUING 64 /* as X3T9.2 spelled it */
|
||||
#define FLAG_TOSHIBA_DELAY 128 /* Allow for borken CD-ROMs */
|
||||
|
||||
#ifdef SUPPORT_TAGS
|
||||
struct tag_alloc {
|
||||
DECLARE_BITMAP(allocated, MAX_TAGS);
|
||||
int nr_allocated;
|
||||
int queue_size;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct NCR5380_hostdata {
|
||||
NCR5380_implementation_fields; /* implementation specific */
|
||||
struct Scsi_Host *host; /* Host backpointer */
|
||||
unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */
|
||||
unsigned char busy[8]; /* index = target, bit = lun */
|
||||
#if defined(REAL_DMA) || defined(REAL_DMA_POLL)
|
||||
int dma_len; /* requested length of DMA */
|
||||
#endif
|
||||
unsigned char last_message; /* last message OUT */
|
||||
struct scsi_cmnd *connected; /* currently connected cmnd */
|
||||
struct scsi_cmnd *selecting; /* cmnd to be connected */
|
||||
|
|
@ -256,13 +238,6 @@ struct NCR5380_hostdata {
|
|||
int read_overruns; /* number of bytes to cut from a
|
||||
* transfer to handle chip overruns */
|
||||
struct work_struct main_task;
|
||||
#ifdef SUPPORT_TAGS
|
||||
struct tag_alloc TagAlloc[8][8]; /* 8 targets and 8 LUNs */
|
||||
#endif
|
||||
#ifdef PSEUDO_DMA
|
||||
unsigned spin_max_r;
|
||||
unsigned spin_max_w;
|
||||
#endif
|
||||
struct workqueue_struct *work_q;
|
||||
unsigned long accesses_per_ms; /* chip register accesses per ms */
|
||||
};
|
||||
|
|
@ -305,132 +280,20 @@ static void NCR5380_print(struct Scsi_Host *instance);
|
|||
#define NCR5380_dprint_phase(flg, arg) do {} while (0)
|
||||
#endif
|
||||
|
||||
#if defined(AUTOPROBE_IRQ)
|
||||
static int NCR5380_probe_irq(struct Scsi_Host *instance, int possible);
|
||||
#endif
|
||||
static int NCR5380_init(struct Scsi_Host *instance, int flags);
|
||||
static int NCR5380_maybe_reset_bus(struct Scsi_Host *);
|
||||
static void NCR5380_exit(struct Scsi_Host *instance);
|
||||
static void NCR5380_information_transfer(struct Scsi_Host *instance);
|
||||
#ifndef DONT_USE_INTR
|
||||
static irqreturn_t NCR5380_intr(int irq, void *dev_id);
|
||||
#endif
|
||||
static void NCR5380_main(struct work_struct *work);
|
||||
static const char *NCR5380_info(struct Scsi_Host *instance);
|
||||
static void NCR5380_reselect(struct Scsi_Host *instance);
|
||||
static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
|
||||
#if defined(PSEUDO_DMA) || defined(REAL_DMA) || defined(REAL_DMA_POLL)
|
||||
static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
#endif
|
||||
static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
static int NCR5380_poll_politely(struct Scsi_Host *, int, int, int, int);
|
||||
static int NCR5380_poll_politely2(struct Scsi_Host *, int, int, int, int, int, int, int);
|
||||
|
||||
#if (defined(REAL_DMA) || defined(REAL_DMA_POLL))
|
||||
|
||||
#if defined(i386) || defined(__alpha__)
|
||||
|
||||
/**
|
||||
* NCR5380_pc_dma_setup - setup ISA DMA
|
||||
* @instance: adapter to set up
|
||||
* @ptr: block to transfer (virtual address)
|
||||
* @count: number of bytes to transfer
|
||||
* @mode: DMA controller mode to use
|
||||
*
|
||||
* Program the DMA controller ready to perform an ISA DMA transfer
|
||||
* on this chip.
|
||||
*
|
||||
* Locks: takes and releases the ISA DMA lock.
|
||||
*/
|
||||
|
||||
static __inline__ int NCR5380_pc_dma_setup(struct Scsi_Host *instance, unsigned char *ptr, unsigned int count, unsigned char mode)
|
||||
{
|
||||
unsigned limit;
|
||||
unsigned long bus_addr = virt_to_bus(ptr);
|
||||
unsigned long flags;
|
||||
|
||||
if (instance->dma_channel <= 3) {
|
||||
if (count > 65536)
|
||||
count = 65536;
|
||||
limit = 65536 - (bus_addr & 0xFFFF);
|
||||
} else {
|
||||
if (count > 65536 * 2)
|
||||
count = 65536 * 2;
|
||||
limit = 65536 * 2 - (bus_addr & 0x1FFFF);
|
||||
}
|
||||
|
||||
if (count > limit)
|
||||
count = limit;
|
||||
|
||||
if ((count & 1) || (bus_addr & 1))
|
||||
panic("scsi%d : attempted unaligned DMA transfer\n", instance->host_no);
|
||||
|
||||
flags=claim_dma_lock();
|
||||
disable_dma(instance->dma_channel);
|
||||
clear_dma_ff(instance->dma_channel);
|
||||
set_dma_addr(instance->dma_channel, bus_addr);
|
||||
set_dma_count(instance->dma_channel, count);
|
||||
set_dma_mode(instance->dma_channel, mode);
|
||||
enable_dma(instance->dma_channel);
|
||||
release_dma_lock(flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* NCR5380_pc_dma_write_setup - setup ISA DMA write
|
||||
* @instance: adapter to set up
|
||||
* @ptr: block to transfer (virtual address)
|
||||
* @count: number of bytes to transfer
|
||||
*
|
||||
* Program the DMA controller ready to perform an ISA DMA write to the
|
||||
* SCSI controller.
|
||||
*
|
||||
* Locks: called routines take and release the ISA DMA lock.
|
||||
*/
|
||||
|
||||
static __inline__ int NCR5380_pc_dma_write_setup(struct Scsi_Host *instance, unsigned char *src, unsigned int count)
|
||||
{
|
||||
return NCR5380_pc_dma_setup(instance, src, count, DMA_MODE_WRITE);
|
||||
}
|
||||
|
||||
/**
|
||||
* NCR5380_pc_dma_read_setup - setup ISA DMA read
|
||||
* @instance: adapter to set up
|
||||
* @ptr: block to transfer (virtual address)
|
||||
* @count: number of bytes to transfer
|
||||
*
|
||||
* Program the DMA controller ready to perform an ISA DMA read from the
|
||||
* SCSI controller.
|
||||
*
|
||||
* Locks: called routines take and release the ISA DMA lock.
|
||||
*/
|
||||
|
||||
static __inline__ int NCR5380_pc_dma_read_setup(struct Scsi_Host *instance, unsigned char *src, unsigned int count)
|
||||
{
|
||||
return NCR5380_pc_dma_setup(instance, src, count, DMA_MODE_READ);
|
||||
}
|
||||
|
||||
/**
|
||||
* NCR5380_pc_dma_residual - return bytes left
|
||||
* @instance: adapter
|
||||
*
|
||||
* Reports the number of bytes left over after the DMA was terminated.
|
||||
*
|
||||
* Locks: takes and releases the ISA DMA lock.
|
||||
*/
|
||||
|
||||
static __inline__ int NCR5380_pc_dma_residual(struct Scsi_Host *instance)
|
||||
{
|
||||
unsigned long flags;
|
||||
int tmp;
|
||||
|
||||
flags = claim_dma_lock();
|
||||
clear_dma_ff(instance->dma_channel);
|
||||
tmp = get_dma_residue(instance->dma_channel);
|
||||
release_dma_lock(flags);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
#endif /* defined(i386) || defined(__alpha__) */
|
||||
#endif /* defined(REAL_DMA) */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* NCR5380_H */
|
||||
|
|
|
|||
|
|
@ -555,8 +555,6 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
|
|||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
|
||||
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
||||
if (!cmd_fibcontext)
|
||||
return -ENOMEM;
|
||||
|
||||
aac_fib_init(cmd_fibcontext);
|
||||
dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
|
||||
|
|
@ -1037,8 +1035,6 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
|
|||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
|
||||
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
||||
if (!cmd_fibcontext)
|
||||
return -ENOMEM;
|
||||
|
||||
aac_fib_init(cmd_fibcontext);
|
||||
dinfo = (struct aac_get_serial *) fib_data(cmd_fibcontext);
|
||||
|
|
@ -1950,10 +1946,6 @@ static int aac_read(struct scsi_cmnd * scsicmd)
|
|||
* Alocate and initialize a Fib
|
||||
*/
|
||||
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
||||
if (!cmd_fibcontext) {
|
||||
printk(KERN_WARNING "aac_read: fib allocation failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
|
||||
|
||||
|
|
@ -2048,16 +2040,6 @@ static int aac_write(struct scsi_cmnd * scsicmd)
|
|||
* Allocate and initialize a Fib then setup a BlockWrite command
|
||||
*/
|
||||
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
||||
if (!cmd_fibcontext) {
|
||||
/* FIB temporarily unavailable,not catastrophic failure */
|
||||
|
||||
/* scsicmd->result = DID_ERROR << 16;
|
||||
* scsicmd->scsi_done(scsicmd);
|
||||
* return 0;
|
||||
*/
|
||||
printk(KERN_WARNING "aac_write: fib allocation failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
|
||||
|
||||
|
|
@ -2283,8 +2265,6 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
|
|||
* Allocate and initialize a Fib
|
||||
*/
|
||||
cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd);
|
||||
if (!cmd_fibcontext)
|
||||
return SCSI_MLQUEUE_HOST_BUSY;
|
||||
|
||||
aac_fib_init(cmd_fibcontext);
|
||||
|
||||
|
|
@ -3184,8 +3164,6 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
|||
* Allocate and initialize a Fib then setup a BlockWrite command
|
||||
*/
|
||||
cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
|
||||
if (!cmd_fibcontext)
|
||||
return -1;
|
||||
|
||||
status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ enum {
|
|||
#define AAC_INT_MODE_MSI (1<<1)
|
||||
#define AAC_INT_MODE_AIF (1<<2)
|
||||
#define AAC_INT_MODE_SYNC (1<<3)
|
||||
#define AAC_INT_MODE_MSIX (1<<16)
|
||||
|
||||
#define AAC_INT_ENABLE_TYPE1_INTX 0xfffffffb
|
||||
#define AAC_INT_ENABLE_TYPE1_MSIX 0xfffffffa
|
||||
|
|
@ -62,7 +63,7 @@ enum {
|
|||
#define PMC_GLOBAL_INT_BIT0 0x00000001
|
||||
|
||||
#ifndef AAC_DRIVER_BUILD
|
||||
# define AAC_DRIVER_BUILD 41052
|
||||
# define AAC_DRIVER_BUILD 41066
|
||||
# define AAC_DRIVER_BRANCH "-ms"
|
||||
#endif
|
||||
#define MAXIMUM_NUM_CONTAINERS 32
|
||||
|
|
@ -720,7 +721,7 @@ struct sa_registers {
|
|||
};
|
||||
|
||||
|
||||
#define Sa_MINIPORT_REVISION 1
|
||||
#define SA_INIT_NUM_MSIXVECTORS 1
|
||||
|
||||
#define sa_readw(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
|
||||
#define sa_readl(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
|
||||
|
|
@ -2065,6 +2066,10 @@ extern struct aac_common aac_config;
|
|||
#define AifEnAddJBOD 30 /* JBOD created */
|
||||
#define AifEnDeleteJBOD 31 /* JBOD deleted */
|
||||
|
||||
#define AifBuManagerEvent 42 /* Bu management*/
|
||||
#define AifBuCacheDataLoss 10
|
||||
#define AifBuCacheDataRecover 11
|
||||
|
||||
#define AifCmdJobProgress 2 /* Progress report */
|
||||
#define AifJobCtrZero 101 /* Array Zero progress */
|
||||
#define AifJobStsSuccess 1 /* Job completes */
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/mm.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
|
@ -47,6 +48,20 @@ struct aac_common aac_config = {
|
|||
.irq_mod = 1
|
||||
};
|
||||
|
||||
static inline int aac_is_msix_mode(struct aac_dev *dev)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
status = src_readl(dev, MUnit.OMR);
|
||||
return (status & AAC_INT_MODE_MSIX);
|
||||
}
|
||||
|
||||
static inline void aac_change_to_intx(struct aac_dev *dev)
|
||||
{
|
||||
aac_src_access_devreg(dev, AAC_DISABLE_MSIX);
|
||||
aac_src_access_devreg(dev, AAC_ENABLE_INTX);
|
||||
}
|
||||
|
||||
static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long commsize, unsigned long commalign)
|
||||
{
|
||||
unsigned char *base;
|
||||
|
|
@ -91,7 +106,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
|
|||
init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION);
|
||||
if (dev->max_fib_size != sizeof(struct hw_fib))
|
||||
init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4);
|
||||
init->Sa_MSIXVectors = cpu_to_le32(Sa_MINIPORT_REVISION);
|
||||
init->Sa_MSIXVectors = cpu_to_le32(SA_INIT_NUM_MSIXVECTORS);
|
||||
init->fsrev = cpu_to_le32(dev->fsrev);
|
||||
|
||||
/*
|
||||
|
|
@ -378,21 +393,8 @@ void aac_define_int_mode(struct aac_dev *dev)
|
|||
msi_count = i;
|
||||
} else {
|
||||
dev->msi_enabled = 0;
|
||||
printk(KERN_ERR "%s%d: MSIX not supported!! Will try MSI 0x%x.\n",
|
||||
dev->name, dev->id, i);
|
||||
}
|
||||
}
|
||||
|
||||
if (!dev->msi_enabled) {
|
||||
msi_count = 1;
|
||||
i = pci_enable_msi(dev->pdev);
|
||||
|
||||
if (!i) {
|
||||
dev->msi_enabled = 1;
|
||||
dev->msi = 1;
|
||||
} else {
|
||||
printk(KERN_ERR "%s%d: MSI not supported!! Will try INTx 0x%x.\n",
|
||||
dev->name, dev->id, i);
|
||||
dev_err(&dev->pdev->dev,
|
||||
"MSIX not supported!! Will try INTX 0x%x.\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -427,6 +429,15 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
|
|||
dev->comm_interface = AAC_COMM_PRODUCER;
|
||||
dev->raw_io_interface = dev->raw_io_64 = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Enable INTX mode, if not done already Enabled
|
||||
*/
|
||||
if (aac_is_msix_mode(dev)) {
|
||||
aac_change_to_intx(dev);
|
||||
dev_info(&dev->pdev->dev, "Changed firmware to INTX mode");
|
||||
}
|
||||
|
||||
if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
status+0, status+1, status+2, status+3, NULL)) &&
|
||||
|
|
|
|||
|
|
@ -637,10 +637,10 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
|
|||
}
|
||||
return -EFAULT;
|
||||
}
|
||||
/* We used to udelay() here but that absorbed
|
||||
* a CPU when a timeout occured. Not very
|
||||
* useful. */
|
||||
cpu_relax();
|
||||
/*
|
||||
* Allow other processes / CPUS to use core
|
||||
*/
|
||||
schedule();
|
||||
}
|
||||
} else if (down_interruptible(&fibptr->event_wait)) {
|
||||
/* Do nothing ... satisfy
|
||||
|
|
@ -901,6 +901,31 @@ void aac_printf(struct aac_dev *dev, u32 val)
|
|||
memset(cp, 0, 256);
|
||||
}
|
||||
|
||||
static inline int aac_aif_data(struct aac_aifcmd *aifcmd, uint32_t index)
|
||||
{
|
||||
return le32_to_cpu(((__le32 *)aifcmd->data)[index]);
|
||||
}
|
||||
|
||||
|
||||
static void aac_handle_aif_bu(struct aac_dev *dev, struct aac_aifcmd *aifcmd)
|
||||
{
|
||||
switch (aac_aif_data(aifcmd, 1)) {
|
||||
case AifBuCacheDataLoss:
|
||||
if (aac_aif_data(aifcmd, 2))
|
||||
dev_info(&dev->pdev->dev, "Backup unit had cache data loss - [%d]\n",
|
||||
aac_aif_data(aifcmd, 2));
|
||||
else
|
||||
dev_info(&dev->pdev->dev, "Backup Unit had cache data loss\n");
|
||||
break;
|
||||
case AifBuCacheDataRecover:
|
||||
if (aac_aif_data(aifcmd, 2))
|
||||
dev_info(&dev->pdev->dev, "DDR cache data recovered successfully - [%d]\n",
|
||||
aac_aif_data(aifcmd, 2));
|
||||
else
|
||||
dev_info(&dev->pdev->dev, "DDR cache data recovered successfully\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* aac_handle_aif - Handle a message from the firmware
|
||||
|
|
@ -1154,6 +1179,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
|||
ADD : DELETE;
|
||||
break;
|
||||
}
|
||||
case AifBuManagerEvent:
|
||||
aac_handle_aif_bu(dev, aifcmd);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -1996,6 +2023,10 @@ int aac_command_thread(void *data)
|
|||
if (difference <= 0)
|
||||
difference = 1;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
schedule_timeout(difference);
|
||||
|
||||
if (kthread_should_stop())
|
||||
|
|
|
|||
|
|
@ -392,9 +392,10 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
|
|||
if (likely(fib->callback && fib->callback_data)) {
|
||||
fib->flags &= FIB_CONTEXT_FLAG_FASTRESP;
|
||||
fib->callback(fib->callback_data, fib);
|
||||
} else {
|
||||
aac_fib_complete(fib);
|
||||
}
|
||||
} else
|
||||
dev_info(&dev->pdev->dev,
|
||||
"Invalid callback_fib[%d] (*%p)(%p)\n",
|
||||
index, fib->callback, fib->callback_data);
|
||||
} else {
|
||||
unsigned long flagv;
|
||||
dprintk((KERN_INFO "event_wait up\n"));
|
||||
|
|
|
|||
|
|
@ -1299,6 +1299,8 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
else
|
||||
shost->this_id = shost->max_id;
|
||||
|
||||
aac_intr_normal(aac, 0, 2, 0, NULL);
|
||||
|
||||
/*
|
||||
* dmb - we may need to move the setting of these parms somewhere else once
|
||||
* we get a fib that can report the actual numbers
|
||||
|
|
@ -1431,8 +1433,8 @@ static int aac_acquire_resources(struct aac_dev *dev)
|
|||
/* After EEH recovery or suspend resume, max_msix count
|
||||
* may change, therfore updating in init as well.
|
||||
*/
|
||||
aac_adapter_start(dev);
|
||||
dev->init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix);
|
||||
aac_adapter_start(dev);
|
||||
}
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -135,7 +135,8 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
|
|||
|
||||
if (mode & AAC_INT_MODE_AIF) {
|
||||
/* handle AIF */
|
||||
aac_intr_normal(dev, 0, 2, 0, NULL);
|
||||
if (dev->aif_thread && dev->fsa_dev)
|
||||
aac_intr_normal(dev, 0, 2, 0, NULL);
|
||||
if (dev->msi_enabled)
|
||||
aac_src_access_devreg(dev, AAC_CLEAR_AIF_BIT);
|
||||
mode = 0;
|
||||
|
|
|
|||
|
|
@ -13,13 +13,14 @@
|
|||
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#define PSEUDO_DMA
|
||||
|
||||
#define priv(host) ((struct NCR5380_hostdata *)(host)->hostdata)
|
||||
#define NCR5380_read(reg) cumanascsi_read(instance, reg)
|
||||
#define NCR5380_write(reg, value) cumanascsi_write(instance, reg, value)
|
||||
|
||||
#define NCR5380_dma_xfer_len(instance, cmd, phase) (cmd->transfersize)
|
||||
#define NCR5380_dma_recv_setup cumanascsi_pread
|
||||
#define NCR5380_dma_send_setup cumanascsi_pwrite
|
||||
#define NCR5380_dma_residual(instance) (0)
|
||||
|
||||
#define NCR5380_intr cumanascsi_intr
|
||||
#define NCR5380_queue_command cumanascsi_queue_command
|
||||
|
|
@ -41,8 +42,8 @@ void cumanascsi_setup(char *str, int *ints)
|
|||
#define L(v) (((v)<<16)|((v) & 0x0000ffff))
|
||||
#define H(v) (((v)>>16)|((v) & 0xffff0000))
|
||||
|
||||
static inline int
|
||||
NCR5380_pwrite(struct Scsi_Host *host, unsigned char *addr, int len)
|
||||
static inline int cumanascsi_pwrite(struct Scsi_Host *host,
|
||||
unsigned char *addr, int len)
|
||||
{
|
||||
unsigned long *laddr;
|
||||
void __iomem *dma = priv(host)->dma + 0x2000;
|
||||
|
|
@ -101,11 +102,14 @@ NCR5380_pwrite(struct Scsi_Host *host, unsigned char *addr, int len)
|
|||
}
|
||||
end:
|
||||
writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL);
|
||||
return len;
|
||||
|
||||
if (len)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
NCR5380_pread(struct Scsi_Host *host, unsigned char *addr, int len)
|
||||
static inline int cumanascsi_pread(struct Scsi_Host *host,
|
||||
unsigned char *addr, int len)
|
||||
{
|
||||
unsigned long *laddr;
|
||||
void __iomem *dma = priv(host)->dma + 0x2000;
|
||||
|
|
@ -163,7 +167,10 @@ NCR5380_pread(struct Scsi_Host *host, unsigned char *addr, int len)
|
|||
}
|
||||
end:
|
||||
writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL);
|
||||
return len;
|
||||
|
||||
if (len)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned char cumanascsi_read(struct Scsi_Host *host, unsigned int reg)
|
||||
|
|
@ -239,7 +246,7 @@ static int cumanascsi1_probe(struct expansion_card *ec,
|
|||
|
||||
host->irq = ec->irq;
|
||||
|
||||
ret = NCR5380_init(host, 0);
|
||||
ret = NCR5380_init(host, FLAG_DMA_FIXUP | FLAG_LATE_DMA_SETUP);
|
||||
if (ret)
|
||||
goto out_unmap;
|
||||
|
||||
|
|
|
|||
|
|
@ -365,7 +365,7 @@ static struct scsi_host_template cumanascsi2_template = {
|
|||
.eh_abort_handler = fas216_eh_abort,
|
||||
.can_queue = 1,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SCSI_MAX_SG_CHAIN_SEGMENTS,
|
||||
.sg_tablesize = SG_MAX_SEGMENTS,
|
||||
.dma_boundary = IOMD_DMA_BOUNDARY,
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
.proc_name = "cumanascsi2",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue