Commit cdc19470 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI updates from James Bottomley:
 "This update includes the usual round of major driver updates (ncr5380,
  ufs, lpfc, be2iscsi, hisi_sas, storvsc, cxlflash, aacraid,
  megaraid_sas, ...).

  There's also an assortment of minor fixes and the major update of
  switching a bunch of drivers to pci_alloc_irq_vectors from Christoph"

* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (188 commits)
  scsi: megaraid_sas: handle dma_addr_t right on 32-bit
  scsi: megaraid_sas: array overflow in megasas_dump_frame()
  scsi: snic: switch to pci_irq_alloc_vectors
  scsi: megaraid_sas: driver version upgrade
  scsi: megaraid_sas: Change RAID_1_10_RMW_CMDS to RAID_1_PEER_CMDS and set value to 2
  scsi: megaraid_sas: Indentation and smatch warning fixes
  scsi: megaraid_sas: Cleanup VD_EXT_DEBUG and SPAN_DEBUG related debug prints
  scsi: megaraid_sas: Increase internal command pool
  scsi: megaraid_sas: Use synchronize_irq to wait for IRQs to complete
  scsi: megaraid_sas: Bail out the driver load if ld_list_query fails
  scsi: megaraid_sas: Change build_mpt_mfi_pass_thru to return void
  scsi: megaraid_sas: During OCR, if get_ctrl_info fails do not continue with OCR
  scsi: megaraid_sas: Do not set fp_possible if TM capable for non-RW syspdIO, change fp_possible to bool
  scsi: megaraid_sas: Remove unused pd_index from megasas_build_ld_nonrw_fusion
  scsi: megaraid_sas: megasas_return_cmd does not memset IO frame to zero
  scsi: megaraid_sas: max_fw_cmds are decremented twice, remove duplicate
  scsi: megaraid_sas: update can_queue only if the new value is less
  scsi: megaraid_sas: Change max_cmd from u32 to u16 in all functions
  scsi: megaraid_sas: set pd_after_lb from MR_BuildRaidContext and initialize pDevHandle to MR_DEVHANDLE_INVALID
  scsi: megaraid_sas: latest controller OCR capability from FW before sending shutdown DCMD
  ...
parents 772c8f6f d1da522f
...@@ -549,6 +549,7 @@ enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd) ...@@ -549,6 +549,7 @@ enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd)
DPRINTK("EXIT, ret=%d\n", ret); DPRINTK("EXIT, ret=%d\n", ret);
return ret; return ret;
} }
EXPORT_SYMBOL(ata_scsi_timed_out);
static void ata_eh_unload(struct ata_port *ap) static void ata_eh_unload(struct ata_port *ap)
{ {
......
...@@ -716,7 +716,6 @@ struct scsi_transport_template *ata_attach_transport(void) ...@@ -716,7 +716,6 @@ struct scsi_transport_template *ata_attach_transport(void)
return NULL; return NULL;
i->t.eh_strategy_handler = ata_scsi_error; i->t.eh_strategy_handler = ata_scsi_error;
i->t.eh_timed_out = ata_scsi_timed_out;
i->t.user_scan = ata_scsi_user_scan; i->t.user_scan = ata_scsi_user_scan;
i->t.host_attrs.ac.attrs = &i->port_attrs[0]; i->t.host_attrs.ac.attrs = &i->port_attrs[0];
......
...@@ -159,7 +159,6 @@ extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd); ...@@ -159,7 +159,6 @@ extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd); extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
extern void ata_eh_acquire(struct ata_port *ap); extern void ata_eh_acquire(struct ata_port *ap);
extern void ata_eh_release(struct ata_port *ap); extern void ata_eh_release(struct ata_port *ap);
extern enum blk_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
extern void ata_scsi_error(struct Scsi_Host *host); extern void ata_scsi_error(struct Scsi_Host *host);
extern void ata_eh_fastdrain_timerfn(unsigned long arg); extern void ata_eh_fastdrain_timerfn(unsigned long arg);
extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc); extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
......
...@@ -400,27 +400,27 @@ static bool SA5_performant_intr_pending(ctlr_info_t *h) ...@@ -400,27 +400,27 @@ static bool SA5_performant_intr_pending(ctlr_info_t *h)
} }
static struct access_method SA5_access = { static struct access_method SA5_access = {
SA5_submit_command, .submit_command = SA5_submit_command,
SA5_intr_mask, .set_intr_mask = SA5_intr_mask,
SA5_fifo_full, .fifo_full = SA5_fifo_full,
SA5_intr_pending, .intr_pending = SA5_intr_pending,
SA5_completed, .command_completed = SA5_completed,
}; };
static struct access_method SA5B_access = { static struct access_method SA5B_access = {
SA5_submit_command, .submit_command = SA5_submit_command,
SA5B_intr_mask, .set_intr_mask = SA5B_intr_mask,
SA5_fifo_full, .fifo_full = SA5_fifo_full,
SA5B_intr_pending, .intr_pending = SA5B_intr_pending,
SA5_completed, .command_completed = SA5_completed,
}; };
static struct access_method SA5_performant_access = { static struct access_method SA5_performant_access = {
SA5_submit_command, .submit_command = SA5_submit_command,
SA5_performant_intr_mask, .set_intr_mask = SA5_performant_intr_mask,
SA5_fifo_full, .fifo_full = SA5_fifo_full,
SA5_performant_intr_pending, .intr_pending = SA5_performant_intr_pending,
SA5_performant_completed, .command_completed = SA5_performant_completed,
}; };
struct board_type { struct board_type {
......
...@@ -994,6 +994,7 @@ static struct scsi_host_template iscsi_iser_sht = { ...@@ -994,6 +994,7 @@ static struct scsi_host_template iscsi_iser_sht = {
.change_queue_depth = scsi_change_queue_depth, .change_queue_depth = scsi_change_queue_depth,
.sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE, .sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE,
.cmd_per_lun = ISER_DEF_CMD_PER_LUN, .cmd_per_lun = ISER_DEF_CMD_PER_LUN,
.eh_timed_out = iscsi_eh_cmd_timed_out,
.eh_abort_handler = iscsi_eh_abort, .eh_abort_handler = iscsi_eh_abort,
.eh_device_reset_handler= iscsi_eh_device_reset, .eh_device_reset_handler= iscsi_eh_device_reset,
.eh_target_reset_handler = iscsi_eh_recover_target, .eh_target_reset_handler = iscsi_eh_recover_target,
......
...@@ -2869,6 +2869,7 @@ static struct scsi_host_template srp_template = { ...@@ -2869,6 +2869,7 @@ static struct scsi_host_template srp_template = {
.info = srp_target_info, .info = srp_target_info,
.queuecommand = srp_queuecommand, .queuecommand = srp_queuecommand,
.change_queue_depth = srp_change_queue_depth, .change_queue_depth = srp_change_queue_depth,
.eh_timed_out = srp_timed_out,
.eh_abort_handler = srp_abort, .eh_abort_handler = srp_abort,
.eh_device_reset_handler = srp_reset_device, .eh_device_reset_handler = srp_reset_device,
.eh_host_reset_handler = srp_reset_host, .eh_host_reset_handler = srp_reset_host,
......
...@@ -119,6 +119,7 @@ static struct scsi_host_template mptfc_driver_template = { ...@@ -119,6 +119,7 @@ static struct scsi_host_template mptfc_driver_template = {
.target_destroy = mptfc_target_destroy, .target_destroy = mptfc_target_destroy,
.slave_destroy = mptscsih_slave_destroy, .slave_destroy = mptscsih_slave_destroy,
.change_queue_depth = mptscsih_change_queue_depth, .change_queue_depth = mptscsih_change_queue_depth,
.eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = mptfc_abort, .eh_abort_handler = mptfc_abort,
.eh_device_reset_handler = mptfc_dev_reset, .eh_device_reset_handler = mptfc_dev_reset,
.eh_bus_reset_handler = mptfc_bus_reset, .eh_bus_reset_handler = mptfc_bus_reset,
......
...@@ -65,7 +65,6 @@ ...@@ -65,7 +65,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -1983,6 +1983,7 @@ static struct scsi_host_template mptsas_driver_template = { ...@@ -1983,6 +1983,7 @@ static struct scsi_host_template mptsas_driver_template = {
.target_destroy = mptsas_target_destroy, .target_destroy = mptsas_target_destroy,
.slave_destroy = mptscsih_slave_destroy, .slave_destroy = mptscsih_slave_destroy,
.change_queue_depth = mptscsih_change_queue_depth, .change_queue_depth = mptscsih_change_queue_depth,
.eh_timed_out = mptsas_eh_timed_out,
.eh_abort_handler = mptscsih_abort, .eh_abort_handler = mptscsih_abort,
.eh_device_reset_handler = mptscsih_dev_reset, .eh_device_reset_handler = mptscsih_dev_reset,
.eh_host_reset_handler = mptscsih_host_reset, .eh_host_reset_handler = mptscsih_host_reset,
...@@ -5398,7 +5399,6 @@ mptsas_init(void) ...@@ -5398,7 +5399,6 @@ mptsas_init(void)
sas_attach_transport(&mptsas_transport_functions); sas_attach_transport(&mptsas_transport_functions);
if (!mptsas_transport_template) if (!mptsas_transport_template)
return -ENODEV; return -ENODEV;
mptsas_transport_template->eh_timed_out = mptsas_eh_timed_out;
mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER, mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER,
"mptscsih_io_done"); "mptscsih_io_done");
......
...@@ -330,6 +330,7 @@ static struct scsi_host_template zfcp_scsi_host_template = { ...@@ -330,6 +330,7 @@ static struct scsi_host_template zfcp_scsi_host_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = "zfcp", .name = "zfcp",
.queuecommand = zfcp_scsi_queuecommand, .queuecommand = zfcp_scsi_queuecommand,
.eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = zfcp_scsi_eh_abort_handler, .eh_abort_handler = zfcp_scsi_eh_abort_handler,
.eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler, .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
.eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler, .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
......
...@@ -96,17 +96,6 @@ ...@@ -96,17 +96,6 @@
* of chips. To use it, you write an architecture specific functions * of chips. To use it, you write an architecture specific functions
* and macros and include this file in your driver. * and macros and include this file in your driver.
* *
* These macros control options :
* AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
* for commands that return with a CHECK CONDITION status.
*
* DIFFERENTIAL - if defined, NCR53c81 chips will use external differential
* transceivers.
*
* PSEUDO_DMA - if defined, PSEUDO DMA is used during the data transfer phases.
*
* REAL_DMA - if defined, REAL DMA is used during the data transfer phases.
*
* These macros MUST be defined : * These macros MUST be defined :
* *
* NCR5380_read(register) - read from the specified register * NCR5380_read(register) - read from the specified register
...@@ -347,7 +336,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance) ...@@ -347,7 +336,7 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
#endif #endif
/** /**
* NCR58380_info - report driver and host information * NCR5380_info - report driver and host information
* @instance: relevant scsi host instance * @instance: relevant scsi host instance
* *
* For use as the host template info() handler. * For use as the host template info() handler.
...@@ -360,33 +349,6 @@ static const char *NCR5380_info(struct Scsi_Host *instance) ...@@ -360,33 +349,6 @@ static const char *NCR5380_info(struct Scsi_Host *instance)
return hostdata->info; return hostdata->info;
} }
static void prepare_info(struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata = shost_priv(instance);
snprintf(hostdata->info, sizeof(hostdata->info),
"%s, irq %d, "
"io_port 0x%lx, base 0x%lx, "
"can_queue %d, cmd_per_lun %d, "
"sg_tablesize %d, this_id %d, "
"flags { %s%s%s}, "
"options { %s} ",
instance->hostt->name, instance->irq,
hostdata->io_port, hostdata->base,
instance->can_queue, instance->cmd_per_lun,
instance->sg_tablesize, instance->this_id,
hostdata->flags & FLAG_DMA_FIXUP ? "DMA_FIXUP " : "",
hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "",
hostdata->flags & FLAG_TOSHIBA_DELAY ? "TOSHIBA_DELAY " : "",
#ifdef DIFFERENTIAL
"DIFFERENTIAL "
#endif
#ifdef PARITY
"PARITY "
#endif
"");
}
/** /**
* NCR5380_init - initialise an NCR5380 * NCR5380_init - initialise an NCR5380
* @instance: adapter to configure * @instance: adapter to configure
...@@ -436,7 +398,14 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags) ...@@ -436,7 +398,14 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
if (!hostdata->work_q) if (!hostdata->work_q)
return -ENOMEM; return -ENOMEM;
prepare_info(instance); snprintf(hostdata->info, sizeof(hostdata->info),
"%s, irq %d, io_port 0x%lx, base 0x%lx, can_queue %d, cmd_per_lun %d, sg_tablesize %d, this_id %d, flags { %s%s%s}",
instance->hostt->name, instance->irq, hostdata->io_port,
hostdata->base, instance->can_queue, instance->cmd_per_lun,
instance->sg_tablesize, instance->this_id,
hostdata->flags & FLAG_DMA_FIXUP ? "DMA_FIXUP " : "",
hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "",
hostdata->flags & FLAG_TOSHIBA_DELAY ? "TOSHIBA_DELAY " : "");
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_write(MODE_REG, MR_BASE); NCR5380_write(MODE_REG, MR_BASE);
...@@ -622,8 +591,9 @@ static inline void maybe_release_dma_irq(struct Scsi_Host *instance) ...@@ -622,8 +591,9 @@ static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
list_empty(&hostdata->unissued) && list_empty(&hostdata->unissued) &&
list_empty(&hostdata->autosense) && list_empty(&hostdata->autosense) &&
!hostdata->connected && !hostdata->connected &&
!hostdata->selecting) !hostdata->selecting) {
NCR5380_release_dma_irq(instance); NCR5380_release_dma_irq(instance);
}
} }
/** /**
...@@ -962,6 +932,7 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id) ...@@ -962,6 +932,7 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id)
static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
struct scsi_cmnd *cmd) struct scsi_cmnd *cmd)
__releases(&hostdata->lock) __acquires(&hostdata->lock)
{ {
struct NCR5380_hostdata *hostdata = shost_priv(instance); struct NCR5380_hostdata *hostdata = shost_priv(instance);
unsigned char tmp[3], phase; unsigned char tmp[3], phase;
...@@ -1194,8 +1165,16 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance, ...@@ -1194,8 +1165,16 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
data = tmp; data = tmp;
phase = PHASE_MSGOUT; phase = PHASE_MSGOUT;
NCR5380_transfer_pio(instance, &phase, &len, &data); NCR5380_transfer_pio(instance, &phase, &len, &data);
if (len) {
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
cmd->result = DID_ERROR << 16;
complete_cmd(instance, cmd);
dsprintk(NDEBUG_SELECTION, instance, "IDENTIFY message transfer failed\n");
cmd = NULL;
goto out;
}
dsprintk(NDEBUG_SELECTION, instance, "nexus established.\n"); dsprintk(NDEBUG_SELECTION, instance, "nexus established.\n");
/* XXX need to handle errors here */
hostdata->connected = cmd; hostdata->connected = cmd;
hostdata->busy[cmd->device->id] |= 1 << cmd->device->lun; hostdata->busy[cmd->device->id] |= 1 << cmd->device->lun;
...@@ -1654,6 +1633,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance, ...@@ -1654,6 +1633,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
*/ */
static void NCR5380_information_transfer(struct Scsi_Host *instance) static void NCR5380_information_transfer(struct Scsi_Host *instance)
__releases(&hostdata->lock) __acquires(&hostdata->lock)
{ {
struct NCR5380_hostdata *hostdata = shost_priv(instance); struct NCR5380_hostdata *hostdata = shost_priv(instance);
unsigned char msgout = NOP; unsigned char msgout = NOP;
......
...@@ -81,11 +81,7 @@ ...@@ -81,11 +81,7 @@
#define ICR_ASSERT_ATN 0x02 /* rw Set to assert ATN */ #define ICR_ASSERT_ATN 0x02 /* rw Set to assert ATN */
#define ICR_ASSERT_DATA 0x01 /* rw SCSI_DATA_REG is asserted */ #define ICR_ASSERT_DATA 0x01 /* rw SCSI_DATA_REG is asserted */
#ifdef DIFFERENTIAL
#define ICR_BASE ICR_DIFF_ENABLE
#else
#define ICR_BASE 0 #define ICR_BASE 0
#endif
#define MODE_REG 2 #define MODE_REG 2
/* /*
...@@ -102,11 +98,7 @@ ...@@ -102,11 +98,7 @@
#define MR_DMA_MODE 0x02 /* rw DMA / pseudo DMA mode */ #define MR_DMA_MODE 0x02 /* rw DMA / pseudo DMA mode */
#define MR_ARBITRATE 0x01 /* rw start arbitration */ #define MR_ARBITRATE 0x01 /* rw start arbitration */
#ifdef PARITY
#define MR_BASE MR_ENABLE_PAR_CHECK
#else
#define MR_BASE 0 #define MR_BASE 0
#endif
#define TARGET_COMMAND_REG 3 #define TARGET_COMMAND_REG 3
#define TCR_LAST_BYTE_SENT 0x80 /* ro DMA done */ #define TCR_LAST_BYTE_SENT 0x80 /* ro DMA done */
...@@ -174,11 +166,7 @@ ...@@ -174,11 +166,7 @@
#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer read */ #define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer read */
#define CSR_GATED_53C80_IRQ 0x01 /* ro Last block xferred */ #define CSR_GATED_53C80_IRQ 0x01 /* ro Last block xferred */
#if 0
#define CSR_BASE CSR_SCSI_BUFF_INTR | CSR_53C80_INTR
#else
#define CSR_BASE CSR_53C80_INTR #define CSR_BASE CSR_53C80_INTR
#endif
/* Note : PHASE_* macros are based on the values of the STATUS register */ /* Note : PHASE_* macros are based on the values of the STATUS register */
#define PHASE_MASK (SR_MSG | SR_CD | SR_IO) #define PHASE_MASK (SR_MSG | SR_CD | SR_IO)
...@@ -234,11 +222,9 @@ struct NCR5380_hostdata { ...@@ -234,11 +222,9 @@ struct NCR5380_hostdata {
unsigned char id_higher_mask; /* All bits above id_mask */ unsigned char id_higher_mask; /* All bits above id_mask */
unsigned char last_message; /* Last Message Out */ unsigned char last_message; /* Last Message Out */
unsigned long region_size; /* Size of address/port range */ unsigned long region_size; /* Size of address/port range */
char info[256]; char info[168]; /* Host banner message */
}; };
#ifdef __KERNEL__
struct NCR5380_cmd { struct NCR5380_cmd {
struct list_head list; struct list_head list;
}; };
...@@ -331,5 +317,4 @@ static inline int NCR5380_dma_residual_none(struct NCR5380_hostdata *hostdata) ...@@ -331,5 +317,4 @@ static inline int NCR5380_dma_residual_none(struct NCR5380_hostdata *hostdata)
return 0; return 0;
} }
#endif /* __KERNEL__ */
#endif /* NCR5380_H */ #endif /* NCR5380_H */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000-2010 Adaptec, Inc. * Copyright (c) 2000-2010 Adaptec, Inc.
* 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
* 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -122,7 +123,6 @@ unsigned int aac_response_normal(struct aac_queue * q) ...@@ -122,7 +123,6 @@ unsigned int aac_response_normal(struct aac_queue * q)
* NOTE: we cannot touch the fib after this * NOTE: we cannot touch the fib after this
* call, because it may have been deallocated. * call, because it may have been deallocated.
*/ */
fib->flags &= FIB_CONTEXT_FLAG_FASTRESP;
fib->callback(fib->callback_data, fib); fib->callback(fib->callback_data, fib);
} else { } else {
unsigned long flagv; unsigned long flagv;
...@@ -251,8 +251,9 @@ static void aac_aif_callback(void *context, struct fib * fibptr) ...@@ -251,8 +251,9 @@ static void aac_aif_callback(void *context, struct fib * fibptr)
BUG_ON(fibptr == NULL); BUG_ON(fibptr == NULL);
dev = fibptr->dev; dev = fibptr->dev;
if (fibptr->hw_fib_va->header.XferState & if ((fibptr->hw_fib_va->header.XferState &
cpu_to_le32(NoMoreAifDataAvailable)) { cpu_to_le32(NoMoreAifDataAvailable)) ||
dev->sa_firmware) {
aac_fib_complete(fibptr); aac_fib_complete(fibptr);
aac_fib_free(fibptr); aac_fib_free(fibptr);
return; return;
...@@ -282,8 +283,8 @@ static void aac_aif_callback(void *context, struct fib * fibptr) ...@@ -282,8 +283,8 @@ static void aac_aif_callback(void *context, struct fib * fibptr)
* know there is a response on our normal priority queue. We will pull off * know there is a response on our normal priority queue. We will pull off
* all QE there are and wake up all the waiters before exiting. * all QE there are and wake up all the waiters before exiting.
*/ */
unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, int isAif,
int isAif, int isFastResponse, struct hw_fib *aif_fib) int isFastResponse, struct hw_fib *aif_fib)
{ {
unsigned long mflags; unsigned long mflags;
dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index)); dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index));
...@@ -305,12 +306,14 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, ...@@ -305,12 +306,14 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
kfree (fib); kfree (fib);
return 1; return 1;
} }
if (aif_fib != NULL) { if (dev->sa_firmware) {
fib->hbacmd_size = index; /* store event type */
} else if (aif_fib != NULL) {
memcpy(hw_fib, aif_fib, sizeof(struct hw_fib)); memcpy(hw_fib, aif_fib, sizeof(struct hw_fib));
} else { } else {
memcpy(hw_fib, memcpy(hw_fib, (struct hw_fib *)
(struct hw_fib *)(((uintptr_t)(dev->regs.sa)) + (((uintptr_t)(dev->regs.sa)) + index),
index), sizeof(struct hw_fib)); sizeof(struct hw_fib));
} }
INIT_LIST_HEAD(&fib->fiblink); INIT_LIST_HEAD(&fib->fiblink);
fib->type = FSAFS_NTC_FIB_CONTEXT; fib->type = FSAFS_NTC_FIB_CONTEXT;
...@@ -344,7 +347,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, ...@@ -344,7 +347,7 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
(fib_callback)aac_aif_callback, fibctx); (fib_callback)aac_aif_callback, fibctx);
} else { } else {
struct fib *fib = &dev->fibs[index]; struct fib *fib = &dev->fibs[index];
struct hw_fib * hwfib = fib->hw_fib_va; int start_callback = 0;
/* /*
* Remove this fib from the Outstanding I/O queue. * Remove this fib from the Outstanding I/O queue.
...@@ -362,45 +365,77 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, ...@@ -362,45 +365,77 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
return 0; return 0;
} }
FIB_COUNTER_INCREMENT(aac_config.FibRecved);
if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) {
if (isFastResponse)
fib->flags |= FIB_CONTEXT_FLAG_FASTRESP;
if (fib->callback) {
start_callback = 1;
} else {
unsigned long flagv;
int complete = 0;
dprintk((KERN_INFO "event_wait up\n"));
spin_lock_irqsave(&fib->event_lock, flagv);
if (fib->done == 2) {
fib->done = 1;
complete = 1;
} else {
fib->done = 1;
up(&fib->event_wait);
}
spin_unlock_irqrestore(&fib->event_lock, flagv);
spin_lock_irqsave(&dev->manage_lock, mflags);
dev->management_fib_count--;
spin_unlock_irqrestore(&dev->manage_lock,
mflags);
FIB_COUNTER_INCREMENT(aac_config.NativeRecved);
if (complete)
aac_fib_complete(fib);
}
} else {
struct hw_fib *hwfib = fib->hw_fib_va;
if (isFastResponse) { if (isFastResponse) {
/* /* Doctor the fib */
* Doctor the fib
*/
*(__le32 *)hwfib->data = cpu_to_le32(ST_OK); *(__le32 *)hwfib->data = cpu_to_le32(ST_OK);
hwfib->header.XferState |= cpu_to_le32(AdapterProcessed); hwfib->header.XferState |=
cpu_to_le32(AdapterProcessed);
fib->flags |= FIB_CONTEXT_FLAG_FASTRESP; fib->flags |= FIB_CONTEXT_FLAG_FASTRESP;
} }
FIB_COUNTER_INCREMENT(aac_config.FibRecved); if (hwfib->header.Command ==
cpu_to_le16(NuFileSystem)) {
if (hwfib->header.Command == cpu_to_le16(NuFileSystem))
{
__le32 *pstatus = (__le32 *)hwfib->data; __le32 *pstatus = (__le32 *)hwfib->data;
if (*pstatus & cpu_to_le32(0xffff0000)) if (*pstatus & cpu_to_le32(0xffff0000))
*pstatus = cpu_to_le32(ST_OK); *pstatus = cpu_to_le32(ST_OK);
} }
if (hwfib->header.XferState & cpu_to_le32(NoResponseExpected | Async)) if (hwfib->header.XferState &
{ cpu_to_le32(NoResponseExpected | Async)) {
if (hwfib->header.XferState & cpu_to_le32(NoResponseExpected)) if (hwfib->header.XferState & cpu_to_le32(
FIB_COUNTER_INCREMENT(aac_config.NoResponseRecved); NoResponseExpected))
FIB_COUNTER_INCREMENT(
aac_config.NoResponseRecved);
else else
FIB_COUNTER_INCREMENT(aac_config.AsyncRecved); FIB_COUNTER_INCREMENT(
/* aac_config.AsyncRecved);
* NOTE: we cannot touch the fib after this start_callback = 1;
* call, because it may have been deallocated.
*/
if (likely(fib->callback && fib->callback_data)) {
fib->flags &= FIB_CONTEXT_FLAG_FASTRESP;
fib->callback(fib->callback_data, fib);
} else
dev_info(&dev->pdev->dev,
"Invalid callback_fib[%d] (*%p)(%p)\n",
index, fib->callback, fib->callback_data);
} else { } else {
unsigned long flagv; unsigned long flagv;
int complete = 0;
dprintk((KERN_INFO "event_wait up\n")); dprintk((KERN_INFO "event_wait up\n"));
spin_lock_irqsave(&fib->event_lock, flagv); spin_lock_irqsave(&fib->event_lock, flagv);
if (!fib->done) { if (fib->done == 2) {
fib->done = 1;
complete = 1;
} else {
fib->done = 1; fib->done = 1;
up(&fib->event_wait); up(&fib->event_wait);
} }
...@@ -408,15 +443,27 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, ...@@ -408,15 +443,27 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
spin_lock_irqsave(&dev->manage_lock, mflags); spin_lock_irqsave(&dev->manage_lock, mflags);
dev->management_fib_count--; dev->management_fib_count--;
spin_unlock_irqrestore(&dev->manage_lock, mflags); spin_unlock_irqrestore(&dev->manage_lock,
mflags);
FIB_COUNTER_INCREMENT(aac_config.NormalRecved); FIB_COUNTER_INCREMENT(aac_config.NormalRecved);
if (fib->done == 2) { if (complete)
spin_lock_irqsave(&fib->event_lock, flagv);
fib->done = 0;
spin_unlock_irqrestore(&fib->event_lock, flagv);
aac_fib_complete(fib); aac_fib_complete(fib);
} }
}
if (start_callback) {
/*
* NOTE: we cannot touch the fib after this
* call, because it may have been deallocated.
*/
if (likely(fib->callback && fib->callback_data)) {
fib->callback(fib->callback_data, fib);
} else {
aac_fib_complete(fib);
aac_fib_free(fib);
}
} }
return 0; return 0;
......
This diff is collapsed.
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000-2010 Adaptec, Inc. * Copyright (c) 2000-2010 Adaptec, Inc.
* 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
* 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000-2010 Adaptec, Inc. * Copyright (c) 2000-2010 Adaptec, Inc.
* 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
* 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -60,7 +61,7 @@ static int aac_rkt_select_comm(struct aac_dev *dev, int comm) ...@@ -60,7 +61,7 @@ static int aac_rkt_select_comm(struct aac_dev *dev, int comm)
* case warrants this half baked, but convenient, check here. * case warrants this half baked, but convenient, check here.
*/ */
if (dev->scsi_host_ptr->can_queue > AAC_NUM_IO_FIB_RKT) { if (dev->scsi_host_ptr->can_queue > AAC_NUM_IO_FIB_RKT) {
dev->init->MaxIoCommands = dev->init->r7.max_io_commands =
cpu_to_le32(AAC_NUM_IO_FIB_RKT + AAC_NUM_MGT_FIB); cpu_to_le32(AAC_NUM_IO_FIB_RKT + AAC_NUM_MGT_FIB);
dev->scsi_host_ptr->can_queue = AAC_NUM_IO_FIB_RKT; dev->scsi_host_ptr->can_queue = AAC_NUM_IO_FIB_RKT;
} }
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000-2010 Adaptec, Inc. * Copyright (c) 2000-2010 Adaptec, Inc.
* 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
* 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -315,10 +316,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event) ...@@ -315,10 +316,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
static void aac_rx_start_adapter(struct aac_dev *dev) static void aac_rx_start_adapter(struct aac_dev *dev)
{ {
struct aac_init *init; union aac_init *init;
init = dev->init; init = dev->init;
init->HostElapsedSeconds = cpu_to_le32(get_seconds()); init->r7.host_elapsed_seconds = cpu_to_le32(get_seconds());
// We can only use a 32 bit address here // We can only use a 32 bit address here
rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL); 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
...@@ -470,7 +471,7 @@ static int aac_rx_ioremap(struct aac_dev * dev, u32 size) ...@@ -470,7 +471,7 @@ static int aac_rx_ioremap(struct aac_dev * dev, u32 size)
return 0; return 0;
} }
static int aac_rx_restart_adapter(struct aac_dev *dev, int bled) static int aac_rx_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{ {
u32 var = 0; u32 var = 0;
...@@ -559,7 +560,7 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -559,7 +560,7 @@ int _aac_rx_init(struct aac_dev *dev)
dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt;
dev->OIMR = status = rx_readb (dev, MUnit.OIMR); dev->OIMR = status = rx_readb (dev, MUnit.OIMR);
if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) && if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) &&
!aac_rx_restart_adapter(dev, 0)) !aac_rx_restart_adapter(dev, 0, IOP_HWSOFT_RESET))
/* Make sure the Hardware FIFO is empty */ /* Make sure the Hardware FIFO is empty */
while ((++restart < 512) && while ((++restart < 512) &&
(rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL)); (rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL));
...@@ -568,7 +569,8 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -568,7 +569,8 @@ int _aac_rx_init(struct aac_dev *dev)
*/ */
status = rx_readl(dev, MUnit.OMRx[0]); status = rx_readl(dev, MUnit.OMRx[0]);
if (status & KERNEL_PANIC) { if (status & KERNEL_PANIC) {
if (aac_rx_restart_adapter(dev, aac_rx_check_health(dev))) if (aac_rx_restart_adapter(dev,
aac_rx_check_health(dev), IOP_HWSOFT_RESET))
goto error_iounmap; goto error_iounmap;
++restart; ++restart;
} }
...@@ -606,7 +608,8 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -606,7 +608,8 @@ int _aac_rx_init(struct aac_dev *dev)
((startup_timeout > 60) ((startup_timeout > 60)
? (startup_timeout - 60) ? (startup_timeout - 60)
: (startup_timeout / 2))))) { : (startup_timeout / 2))))) {
if (likely(!aac_rx_restart_adapter(dev, aac_rx_check_health(dev)))) if (likely(!aac_rx_restart_adapter(dev,
aac_rx_check_health(dev), IOP_HWSOFT_RESET)))
start = jiffies; start = jiffies;
++restart; ++restart;
} }
......
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000-2010 Adaptec, Inc. * Copyright (c) 2000-2010 Adaptec, Inc.
* 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
* 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -245,19 +246,19 @@ static void aac_sa_interrupt_adapter (struct aac_dev *dev) ...@@ -245,19 +246,19 @@ static void aac_sa_interrupt_adapter (struct aac_dev *dev)
static void aac_sa_start_adapter(struct aac_dev *dev) static void aac_sa_start_adapter(struct aac_dev *dev)
{ {
struct aac_init *init; union aac_init *init;
/* /*
* Fill in the remaining pieces of the init. * Fill in the remaining pieces of the init.
*/ */
init = dev->init; init = dev->init;
init->HostElapsedSeconds = cpu_to_le32(get_seconds()); init->r7.host_elapsed_seconds = cpu_to_le32(get_seconds());
/* We can only use a 32 bit address here */ /* We can only use a 32 bit address here */
sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
(u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0, (u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL);
} }
static int aac_sa_restart_adapter(struct aac_dev *dev, int bled) static int aac_sa_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{ {
return -EINVAL; return -EINVAL;
} }
......
This diff is collapsed.
...@@ -178,37 +178,6 @@ static int scsi_dma_is_ignored_buserr(unsigned char dma_stat) ...@@ -178,37 +178,6 @@ static int scsi_dma_is_ignored_buserr(unsigned char dma_stat)
} }
#if 0
/* Dead code... wasn't called anyway :-) and causes some trouble, because at
* end-of-DMA, both SCSI ints are triggered simultaneously, so the NCR int has
* to clear the DMA int pending bit before it allows other level 6 interrupts.
*/
static void scsi_dma_buserr(int irq, void *dummy)
{
unsigned char dma_stat = tt_scsi_dma.dma_ctrl;
/* Don't do anything if a NCR interrupt is pending. Probably it's just
* masked... */
if (atari_irq_pending(IRQ_TT_MFP_SCSI))
return;
printk("Bad SCSI DMA interrupt! dma_addr=0x%08lx dma_stat=%02x dma_cnt=%08lx\n",
SCSI_DMA_READ_P(dma_addr), dma_stat, SCSI_DMA_READ_P(dma_cnt));
if (dma_stat & 0x80) {
if (!scsi_dma_is_ignored_buserr(dma_stat))
printk("SCSI DMA bus error -- bad DMA programming!\n");
} else {
/* Under normal circumstances we never should get to this point,
* since both interrupts are triggered simultaneously and the 5380
* int has higher priority. When this irq is handled, that DMA
* interrupt is cleared. So a warning message is printed here.
*/
printk("SCSI DMA intr ?? -- this shouldn't happen!\n");
}
}
#endif
static irqreturn_t scsi_tt_intr(int irq, void *dev) static irqreturn_t scsi_tt_intr(int irq, void *dev)
{ {
struct Scsi_Host *instance = dev; struct Scsi_Host *instance = dev;
...@@ -713,6 +682,7 @@ static int atari_scsi_bus_reset(struct scsi_cmnd *cmd) ...@@ -713,6 +682,7 @@ static int atari_scsi_bus_reset(struct scsi_cmnd *cmd)
if (IS_A_TT()) { if (IS_A_TT()) {
tt_scsi_dma.dma_ctrl = 0; tt_scsi_dma.dma_ctrl = 0;
} else { } else {
if (stdma_is_locked_by(scsi_falcon_intr))
st_dma.dma_mode_status = 0x90; st_dma.dma_mode_status = 0x90;
atari_dma_active = 0; atari_dma_active = 0;
atari_dma_orig_addr = NULL; atari_dma_orig_addr = NULL;
...@@ -813,7 +783,7 @@ static int __init atari_scsi_probe(struct platform_device *pdev) ...@@ -813,7 +783,7 @@ static int __init atari_scsi_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer); atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);
atari_dma_orig_addr = 0; atari_dma_orig_addr = NULL;
} }
instance = scsi_host_alloc(&atari_scsi_template, instance = scsi_host_alloc(&atari_scsi_template,
......
...@@ -84,7 +84,6 @@ static inline void queue_tail_inc(struct be_queue_info *q) ...@@ -84,7 +84,6 @@ static inline void queue_tail_inc(struct be_queue_info *q)
/*ISCSI */ /*ISCSI */
struct be_aic_obj { /* Adaptive interrupt coalescing (AIC) info */ struct be_aic_obj { /* Adaptive interrupt coalescing (AIC) info */
bool enable;
u32 min_eqd; /* in usecs */ u32 min_eqd; /* in usecs */
u32 max_eqd; /* in usecs */ u32 max_eqd; /* in usecs */
u32 prev_eqd; /* in usecs */ u32 prev_eqd; /* in usecs */
...@@ -94,8 +93,6 @@ struct be_aic_obj { /* Adaptive interrupt coalescing (AIC) info */ ...@@ -94,8 +93,6 @@ struct be_aic_obj { /* Adaptive interrupt coalescing (AIC) info */
}; };
struct be_eq_obj { struct be_eq_obj {
bool todo_mcc_cq;
bool todo_cq;
u32 cq_count; u32 cq_count;
struct be_queue_info q; struct be_queue_info q;
struct beiscsi_hba *phba; struct beiscsi_hba *phba;
......
...@@ -676,9 +676,9 @@ void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len, ...@@ -676,9 +676,9 @@ void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len,
bool embedded, u8 sge_cnt) bool embedded, u8 sge_cnt)
{ {
if (embedded) if (embedded)
wrb->embedded |= MCC_WRB_EMBEDDED_MASK; wrb->emb_sgecnt_special |= MCC_WRB_EMBEDDED_MASK;
else else
wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) << wrb->emb_sgecnt_special |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) <<
MCC_WRB_SGE_CNT_SHIFT; MCC_WRB_SGE_CNT_SHIFT;
wrb->payload_length = payload_len; wrb->payload_length = payload_len;
be_dws_cpu_to_le(wrb, 8); be_dws_cpu_to_le(wrb, 8);
...@@ -1599,7 +1599,7 @@ int beiscsi_cmd_function_reset(struct beiscsi_hba *phba) ...@@ -1599,7 +1599,7 @@ int beiscsi_cmd_function_reset(struct beiscsi_hba *phba)
{ {
struct be_ctrl_info *ctrl = &phba->ctrl; struct be_ctrl_info *ctrl = &phba->ctrl;
struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
struct be_post_sgl_pages_req *req = embedded_payload(wrb); struct be_post_sgl_pages_req *req;
int status; int status;
mutex_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
...@@ -1700,31 +1700,34 @@ int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp) ...@@ -1700,31 +1700,34 @@ int beiscsi_cmd_iscsi_cleanup(struct beiscsi_hba *phba, unsigned short ulp)
struct be_ctrl_info *ctrl = &phba->ctrl; struct be_ctrl_info *ctrl = &phba->ctrl;
struct iscsi_cleanup_req_v1 *req_v1; struct iscsi_cleanup_req_v1 *req_v1;
struct iscsi_cleanup_req *req; struct iscsi_cleanup_req *req;
u16 hdr_ring_id, data_ring_id;
struct be_mcc_wrb *wrb; struct be_mcc_wrb *wrb;
int status; int status;
mutex_lock(&ctrl->mbox_lock); mutex_lock(&ctrl->mbox_lock);
wrb = wrb_from_mbox(&ctrl->mbox_mem); wrb = wrb_from_mbox(&ctrl->mbox_mem);
hdr_ring_id = HWI_GET_DEF_HDRQ_ID(phba, ulp);
data_ring_id = HWI_GET_DEF_BUFQ_ID(phba, ulp);
if (is_chip_be2_be3r(phba)) {
req = embedded_payload(wrb); req = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req)); OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
/**
* TODO: Check with FW folks the chute value to be set.
* For now, use the ULP_MASK as the chute value.
*/
if (is_chip_be2_be3r(phba)) {
req->chute = (1 << ulp); req->chute = (1 << ulp);
req->hdr_ring_id = HWI_GET_DEF_HDRQ_ID(phba, ulp); /* BE2/BE3 FW creates 8-bit ring id */
req->data_ring_id = HWI_GET_DEF_BUFQ_ID(phba, ulp); req->hdr_ring_id = hdr_ring_id;
req->data_ring_id = data_ring_id;
} else { } else {
req_v1 = (struct iscsi_cleanup_req_v1 *)req; req_v1 = embedded_payload(wrb);
be_wrb_hdr_prepare(wrb, sizeof(*req_v1), true, 0);
be_cmd_hdr_prepare(&req_v1->hdr, CMD_SUBSYSTEM_ISCSI,
OPCODE_COMMON_ISCSI_CLEANUP,
sizeof(*req_v1));
req_v1->hdr.version = 1; req_v1->hdr.version = 1;
req_v1->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba, req_v1->chute = (1 << ulp);
ulp)); req_v1->hdr_ring_id = cpu_to_le16(hdr_ring_id);
req_v1->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba, req_v1->data_ring_id = cpu_to_le16(data_ring_id);
ulp));
} }
status = be_mbox_notify(ctrl); status = be_mbox_notify(ctrl);
......
...@@ -31,10 +31,16 @@ struct be_sge { ...@@ -31,10 +31,16 @@ struct be_sge {
__le32 len; __le32 len;
}; };
#define MCC_WRB_SGE_CNT_SHIFT 3 /* bits 3 - 7 of dword 0 */
#define MCC_WRB_SGE_CNT_MASK 0x1F /* bits 3 - 7 of dword 0 */
struct be_mcc_wrb { struct be_mcc_wrb {
u32 embedded; /* dword 0 */ u32 emb_sgecnt_special; /* dword 0 */
/* bits 0 - embedded */
/* bits 1 - 2 reserved */
/* bits 3 - 7 sge count */
/* bits 8 - 23 reserved */
/* bits 24 - 31 special */
#define MCC_WRB_EMBEDDED_MASK 1
#define MCC_WRB_SGE_CNT_SHIFT 3
#define MCC_WRB_SGE_CNT_MASK 0x1F
u32 payload_length; /* dword 1 */ u32 payload_length; /* dword 1 */
u32 tag0; /* dword 2 */ u32 tag0; /* dword 2 */
u32 tag1; /* dword 3 */ u32 tag1; /* dword 3 */
...@@ -1133,11 +1139,6 @@ struct tcp_connect_and_offload_out { ...@@ -1133,11 +1139,6 @@ struct tcp_connect_and_offload_out {
} __packed; } __packed;
struct be_mcc_wrb_context {
struct MCC_WRB *wrb;
int *users_final_status;
} __packed;
#define DB_DEF_PDU_RING_ID_MASK 0x3FFF /* bits 0 - 13 */ #define DB_DEF_PDU_RING_ID_MASK 0x3FFF /* bits 0 - 13 */
#define DB_DEF_PDU_CQPROC_MASK 0x3FFF /* bits 16 - 29 */ #define DB_DEF_PDU_CQPROC_MASK 0x3FFF /* bits 16 - 29 */
#define DB_DEF_PDU_REARM_SHIFT 14 #define DB_DEF_PDU_REARM_SHIFT 14
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -808,9 +808,7 @@ void bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t vpwwn[], int *nports); ...@@ -808,9 +808,7 @@ void bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t vpwwn[], int *nports);
/* /*
* fabric protected interface functions * fabric protected interface functions
*/ */
void bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs);
void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs); void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs);
void bfa_fcs_fabric_modexit(struct bfa_fcs_s *fcs);
void bfa_fcs_fabric_link_up(struct bfa_fcs_fabric_s *fabric); void bfa_fcs_fabric_link_up(struct bfa_fcs_fabric_s *fabric);
void bfa_fcs_fabric_link_down(struct bfa_fcs_fabric_s *fabric); void bfa_fcs_fabric_link_down(struct bfa_fcs_fabric_s *fabric);
void bfa_fcs_fabric_addvport(struct bfa_fcs_fabric_s *fabric, void bfa_fcs_fabric_addvport(struct bfa_fcs_fabric_s *fabric,
...@@ -827,8 +825,6 @@ void bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric); ...@@ -827,8 +825,6 @@ void bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric);
void bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric, void bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric,
wwn_t fabric_name); wwn_t fabric_name);
u16 bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric); u16 bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric);
void bfa_fcs_uf_attach(struct bfa_fcs_s *fcs);
void bfa_fcs_port_attach(struct bfa_fcs_s *fcs);
void bfa_fcs_fabric_modstop(struct bfa_fcs_s *fcs); void bfa_fcs_fabric_modstop(struct bfa_fcs_s *fcs);
void bfa_fcs_fabric_sm_online(struct bfa_fcs_fabric_s *fabric, void bfa_fcs_fabric_sm_online(struct bfa_fcs_fabric_s *fabric,
enum bfa_fcs_fabric_event event); enum bfa_fcs_fabric_event event);
......
...@@ -813,6 +813,7 @@ struct scsi_host_template bfad_im_scsi_host_template = { ...@@ -813,6 +813,7 @@ struct scsi_host_template bfad_im_scsi_host_template = {
.name = BFAD_DRIVER_NAME, .name = BFAD_DRIVER_NAME,
.info = bfad_im_info, .info = bfad_im_info,
.queuecommand = bfad_im_queuecommand, .queuecommand = bfad_im_queuecommand,
.eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = bfad_im_abort_handler, .eh_abort_handler = bfad_im_abort_handler,
.eh_device_reset_handler = bfad_im_reset_lun_handler, .eh_device_reset_handler = bfad_im_reset_lun_handler,
.eh_bus_reset_handler = bfad_im_reset_bus_handler, .eh_bus_reset_handler = bfad_im_reset_bus_handler,
...@@ -835,6 +836,7 @@ struct scsi_host_template bfad_im_vport_template = { ...@@ -835,6 +836,7 @@ struct scsi_host_template bfad_im_vport_template = {
.name = BFAD_DRIVER_NAME, .name = BFAD_DRIVER_NAME,
.info = bfad_im_info, .info = bfad_im_info,
.queuecommand = bfad_im_queuecommand, .queuecommand = bfad_im_queuecommand,
.eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = bfad_im_abort_handler, .eh_abort_handler = bfad_im_abort_handler,
.eh_device_reset_handler = bfad_im_reset_lun_handler, .eh_device_reset_handler = bfad_im_reset_lun_handler,
.eh_bus_reset_handler = bfad_im_reset_bus_handler, .eh_bus_reset_handler = bfad_im_reset_bus_handler,
......
...@@ -2947,6 +2947,7 @@ static struct scsi_host_template bnx2fc_shost_template = { ...@@ -2947,6 +2947,7 @@ static struct scsi_host_template bnx2fc_shost_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = "QLogic Offload FCoE Initiator", .name = "QLogic Offload FCoE Initiator",
.queuecommand = bnx2fc_queuecommand, .queuecommand = bnx2fc_queuecommand,
.eh_timed_out = fc_eh_timed_out,
.eh_abort_handler = bnx2fc_eh_abort, /* abts */ .eh_abort_handler = bnx2fc_eh_abort, /* abts */
.eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */ .eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
.eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */ .eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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