mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch '6.13/scsi-fixes' into 6.14/scsi-staging
Pull in fixes branch to resolve merge conflict in ufs-qcom.c. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
@@ -137,7 +137,7 @@ static const struct scsi_host_template mptfc_driver_template = {
|
||||
* Supported hardware
|
||||
*/
|
||||
|
||||
static struct pci_device_id mptfc_pci_table[] = {
|
||||
static const struct pci_device_id mptfc_pci_table[] = {
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC909,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919,
|
||||
|
||||
@@ -5377,7 +5377,7 @@ static void mptsas_remove(struct pci_dev *pdev)
|
||||
mptscsih_remove(pdev);
|
||||
}
|
||||
|
||||
static struct pci_device_id mptsas_pci_table[] = {
|
||||
static const struct pci_device_id mptsas_pci_table[] = {
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1064,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_SAS1068,
|
||||
|
||||
@@ -1239,7 +1239,7 @@ static struct spi_function_template mptspi_transport_functions = {
|
||||
* Supported hardware
|
||||
*/
|
||||
|
||||
static struct pci_device_id mptspi_pci_table[] = {
|
||||
static const struct pci_device_id mptspi_pci_table[] = {
|
||||
{ PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVID_53C1030,
|
||||
PCI_ANY_ID, PCI_ANY_ID },
|
||||
{ PCI_VENDOR_ID_ATTO, MPI_MANUFACTPAGE_DEVID_53C1030,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -127,15 +127,6 @@ struct fc_templates_s {
|
||||
|
||||
void fcbuild_init(void);
|
||||
|
||||
u16 fc_flogi_build(struct fchs_s *fchs, struct fc_logi_s *flogi,
|
||||
u32 s_id, u16 ox_id, wwn_t port_name, wwn_t node_name,
|
||||
u16 pdu_size, u8 set_npiv, u8 set_auth,
|
||||
u16 local_bb_credits);
|
||||
|
||||
u16 fc_fdisc_build(struct fchs_s *buf, struct fc_logi_s *flogi, u32 s_id,
|
||||
u16 ox_id, wwn_t port_name, wwn_t node_name,
|
||||
u16 pdu_size);
|
||||
|
||||
u16 fc_flogi_acc_build(struct fchs_s *fchs, struct fc_logi_s *flogi,
|
||||
u32 s_id, __be16 ox_id,
|
||||
wwn_t port_name, wwn_t node_name,
|
||||
@@ -148,14 +139,6 @@ u16 fc_plogi_build(struct fchs_s *fchs, void *pld, u32 d_id,
|
||||
|
||||
enum fc_parse_status fc_plogi_parse(struct fchs_s *fchs);
|
||||
|
||||
u16 fc_abts_build(struct fchs_s *buf, u32 d_id, u32 s_id,
|
||||
u16 ox_id);
|
||||
|
||||
enum fc_parse_status fc_abts_rsp_parse(struct fchs_s *buf, int len);
|
||||
|
||||
u16 fc_rrq_build(struct fchs_s *buf, struct fc_rrq_s *rrq, u32 d_id,
|
||||
u32 s_id, u16 ox_id, u16 rrq_oxid);
|
||||
|
||||
u16 fc_rspnid_build(struct fchs_s *fchs, void *pld, u32 s_id,
|
||||
u16 ox_id, u8 *name);
|
||||
u16 fc_rsnn_nn_build(struct fchs_s *fchs, void *pld, u32 s_id,
|
||||
@@ -164,10 +147,6 @@ u16 fc_rsnn_nn_build(struct fchs_s *fchs, void *pld, u32 s_id,
|
||||
u16 fc_rftid_build(struct fchs_s *fchs, void *pld, u32 s_id,
|
||||
u16 ox_id, enum bfa_lport_role role);
|
||||
|
||||
u16 fc_rftid_build_sol(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u16 ox_id, u8 *fc4_bitmap,
|
||||
u32 bitmap_size);
|
||||
|
||||
u16 fc_rffid_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u16 ox_id, u8 fc4_type, u8 fc4_ftrs);
|
||||
|
||||
@@ -193,9 +172,6 @@ u16 fc_adisc_build(struct fchs_s *fchs, struct fc_adisc_s *adisc,
|
||||
u32 d_id, u32 s_id, __be16 ox_id, wwn_t port_name,
|
||||
wwn_t node_name);
|
||||
|
||||
enum fc_parse_status fc_adisc_parse(struct fchs_s *fchs, void *pld,
|
||||
u32 host_dap, wwn_t node_name, wwn_t port_name);
|
||||
|
||||
enum fc_parse_status fc_adisc_rsp_parse(struct fc_adisc_s *adisc, int len,
|
||||
wwn_t port_name, wwn_t node_name);
|
||||
|
||||
@@ -216,10 +192,6 @@ u16 fc_prli_acc_build(struct fchs_s *fchs, void *pld, u32 d_id,
|
||||
u32 s_id, __be16 ox_id,
|
||||
enum bfa_lport_role role);
|
||||
|
||||
u16 fc_rnid_build(struct fchs_s *fchs, struct fc_rnid_cmd_s *rnid,
|
||||
u32 d_id, u32 s_id, u16 ox_id,
|
||||
u32 data_format);
|
||||
|
||||
u16 fc_rnid_acc_build(struct fchs_s *fchs,
|
||||
struct fc_rnid_acc_s *rnid_acc, u32 d_id, u32 s_id,
|
||||
__be16 ox_id, u32 data_format,
|
||||
@@ -228,29 +200,15 @@ u16 fc_rnid_acc_build(struct fchs_s *fchs,
|
||||
|
||||
u16 fc_rpsc2_build(struct fchs_s *fchs, struct fc_rpsc2_cmd_s *rps2c,
|
||||
u32 d_id, u32 s_id, u32 *pid_list, u16 npids);
|
||||
u16 fc_rpsc_build(struct fchs_s *fchs, struct fc_rpsc_cmd_s *rpsc,
|
||||
u32 d_id, u32 s_id, u16 ox_id);
|
||||
u16 fc_rpsc_acc_build(struct fchs_s *fchs,
|
||||
struct fc_rpsc_acc_s *rpsc_acc, u32 d_id, u32 s_id,
|
||||
__be16 ox_id, struct fc_rpsc_speed_info_s *oper_speed);
|
||||
u16 fc_gid_ft_build(struct fchs_s *fchs, void *pld, u32 s_id,
|
||||
u8 fc4_type);
|
||||
|
||||
u16 fc_rpnid_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u32 port_id, wwn_t port_name);
|
||||
|
||||
u16 fc_rnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u32 port_id, wwn_t node_name);
|
||||
|
||||
u16 fc_rcsid_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u32 port_id, u32 cos);
|
||||
|
||||
u16 fc_rptid_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u32 port_id, u8 port_type);
|
||||
|
||||
u16 fc_ganxt_build(struct fchs_s *fchs, void *pyld, u32 s_id,
|
||||
u32 port_id);
|
||||
|
||||
u16 fc_logo_build(struct fchs_s *fchs, struct fc_logo_s *logo, u32 d_id,
|
||||
u32 s_id, u16 ox_id, wwn_t port_name);
|
||||
|
||||
@@ -267,46 +225,16 @@ void fc_get_fc4type_bitmask(u8 fc4_type, u8 *bit_mask);
|
||||
void fc_els_req_build(struct fchs_s *fchs, u32 d_id, u32 s_id,
|
||||
__be16 ox_id);
|
||||
|
||||
enum fc_parse_status fc_plogi_rsp_parse(struct fchs_s *fchs, int len,
|
||||
wwn_t port_name);
|
||||
|
||||
enum fc_parse_status fc_prli_parse(struct fc_prli_s *prli);
|
||||
|
||||
enum fc_parse_status fc_pdisc_parse(struct fchs_s *fchs, wwn_t node_name,
|
||||
wwn_t port_name);
|
||||
|
||||
u16 fc_ba_acc_build(struct fchs_s *fchs, struct fc_ba_acc_s *ba_acc, u32 d_id,
|
||||
u32 s_id, __be16 ox_id, u16 rx_id);
|
||||
|
||||
int fc_logout_params_pages(struct fchs_s *fc_frame, u8 els_code);
|
||||
|
||||
u16 fc_tprlo_acc_build(struct fchs_s *fchs, struct fc_tprlo_acc_s *tprlo_acc,
|
||||
u32 d_id, u32 s_id, __be16 ox_id, int num_pages);
|
||||
|
||||
u16 fc_prlo_acc_build(struct fchs_s *fchs, struct fc_prlo_acc_s *prlo_acc,
|
||||
u32 d_id, u32 s_id, __be16 ox_id, int num_pages);
|
||||
|
||||
u16 fc_pdisc_build(struct fchs_s *fchs, u32 d_id, u32 s_id,
|
||||
u16 ox_id, wwn_t port_name, wwn_t node_name,
|
||||
u16 pdu_size);
|
||||
|
||||
u16 fc_pdisc_rsp_parse(struct fchs_s *fchs, int len, wwn_t port_name);
|
||||
|
||||
u16 fc_prlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id,
|
||||
u16 ox_id, int num_pages);
|
||||
|
||||
u16 fc_tprlo_build(struct fchs_s *fchs, u32 d_id, u32 s_id,
|
||||
u16 ox_id, int num_pages, enum fc_tprlo_type tprlo_type,
|
||||
u32 tpr_id);
|
||||
|
||||
u16 fc_ba_rjt_build(struct fchs_s *fchs, u32 d_id, u32 s_id,
|
||||
__be16 ox_id, u32 reason_code, u32 reason_expl);
|
||||
|
||||
u16 fc_gnnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,
|
||||
u32 port_id);
|
||||
|
||||
u16 fc_ct_rsp_parse(struct ct_hdr_s *cthdr);
|
||||
|
||||
u16 fc_rscn_build(struct fchs_s *fchs, struct fc_rscn_pl_s *rscn, u32 s_id,
|
||||
u16 ox_id);
|
||||
#endif
|
||||
|
||||
@@ -242,7 +242,7 @@ lpfc_nvme_remoteport_delete(struct nvme_fc_remote_port *remoteport)
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @axchg: pointer to exchange context for the NVME LS request
|
||||
*
|
||||
* This routine is used for processing an asychronously received NVME LS
|
||||
* This routine is used for processing an asynchronously received NVME LS
|
||||
* request. Any remaining validation is done and the LS is then forwarded
|
||||
* to the nvme-fc transport via nvme_fc_rcv_ls_req().
|
||||
*
|
||||
|
||||
@@ -2142,7 +2142,7 @@ lpfc_nvmet_destroy_targetport(struct lpfc_hba *phba)
|
||||
* @phba: pointer to lpfc hba data structure.
|
||||
* @axchg: pointer to exchange context for the NVME LS request
|
||||
*
|
||||
* This routine is used for processing an asychronously received NVME LS
|
||||
* This routine is used for processing an asynchronously received NVME LS
|
||||
* request. Any remaining validation is done and the LS is then forwarded
|
||||
* to the nvmet-fc transport via nvmet_fc_rcv_ls_req().
|
||||
*
|
||||
|
||||
@@ -8907,8 +8907,11 @@ megasas_aen_polling(struct work_struct *work)
|
||||
(ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL),
|
||||
(ld_target_id % MEGASAS_MAX_DEV_PER_CHANNEL),
|
||||
0);
|
||||
if (sdev1)
|
||||
if (sdev1) {
|
||||
mutex_unlock(&instance->reset_mutex);
|
||||
megasas_remove_scsi_device(sdev1);
|
||||
mutex_lock(&instance->reset_mutex);
|
||||
}
|
||||
|
||||
event_type = SCAN_VD_CHANNEL;
|
||||
break;
|
||||
|
||||
@@ -57,8 +57,8 @@ extern struct list_head mrioc_list;
|
||||
extern int prot_mask;
|
||||
extern atomic64_t event_counter;
|
||||
|
||||
#define MPI3MR_DRIVER_VERSION "8.12.0.0.50"
|
||||
#define MPI3MR_DRIVER_RELDATE "05-Sept-2024"
|
||||
#define MPI3MR_DRIVER_VERSION "8.12.0.3.50"
|
||||
#define MPI3MR_DRIVER_RELDATE "11-November-2024"
|
||||
|
||||
#define MPI3MR_DRIVER_NAME "mpi3mr"
|
||||
#define MPI3MR_DRIVER_LICENSE "GPL"
|
||||
@@ -134,8 +134,6 @@ extern atomic64_t event_counter;
|
||||
|
||||
#define MPI3MR_WATCHDOG_INTERVAL 1000 /* in milli seconds */
|
||||
|
||||
#define MPI3MR_DEFAULT_CFG_PAGE_SZ 1024 /* in bytes */
|
||||
|
||||
#define MPI3MR_RESET_TOPOLOGY_SETTLE_TIME 10
|
||||
|
||||
#define MPI3MR_SCMD_TIMEOUT (60 * HZ)
|
||||
@@ -1133,9 +1131,6 @@ struct scmd_priv {
|
||||
* @io_throttle_low: I/O size to stop throttle in 512b blocks
|
||||
* @num_io_throttle_group: Maximum number of throttle groups
|
||||
* @throttle_groups: Pointer to throttle group info structures
|
||||
* @cfg_page: Default memory for configuration pages
|
||||
* @cfg_page_dma: Configuration page DMA address
|
||||
* @cfg_page_sz: Default configuration page memory size
|
||||
* @sas_transport_enabled: SAS transport enabled or not
|
||||
* @scsi_device_channel: Channel ID for SCSI devices
|
||||
* @transport_cmds: Command tracker for SAS transport commands
|
||||
@@ -1332,10 +1327,6 @@ struct mpi3mr_ioc {
|
||||
u16 num_io_throttle_group;
|
||||
struct mpi3mr_throttle_group_info *throttle_groups;
|
||||
|
||||
void *cfg_page;
|
||||
dma_addr_t cfg_page_dma;
|
||||
u16 cfg_page_sz;
|
||||
|
||||
u8 sas_transport_enabled;
|
||||
u8 scsi_device_channel;
|
||||
struct mpi3mr_drv_cmd transport_cmds;
|
||||
|
||||
@@ -2329,6 +2329,15 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
if (!mrioc)
|
||||
return -ENODEV;
|
||||
|
||||
if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) {
|
||||
dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (!mrioc->ioctl_sges_allocated) {
|
||||
dprint_bsg_err(mrioc, "%s: DMA memory was not allocated\n",
|
||||
__func__);
|
||||
@@ -2339,13 +2348,16 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
karg->timeout = MPI3MR_APP_DEFAULT_TIMEOUT;
|
||||
|
||||
mpi_req = kzalloc(MPI3MR_ADMIN_REQ_FRAME_SZ, GFP_KERNEL);
|
||||
if (!mpi_req)
|
||||
if (!mpi_req) {
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
mpi_header = (struct mpi3_request_header *)mpi_req;
|
||||
|
||||
bufcnt = karg->buf_entry_list.num_of_entries;
|
||||
drv_bufs = kzalloc((sizeof(*drv_bufs) * bufcnt), GFP_KERNEL);
|
||||
if (!drv_bufs) {
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
@@ -2353,6 +2365,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
dout_buf = kzalloc(job->request_payload.payload_len,
|
||||
GFP_KERNEL);
|
||||
if (!dout_buf) {
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
@@ -2360,6 +2373,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
din_buf = kzalloc(job->reply_payload.payload_len,
|
||||
GFP_KERNEL);
|
||||
if (!din_buf) {
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
@@ -2435,6 +2449,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
(mpi_msg_size > MPI3MR_ADMIN_REQ_FRAME_SZ)) {
|
||||
dprint_bsg_err(mrioc, "%s: invalid MPI message size\n",
|
||||
__func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2447,6 +2462,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
if (invalid_be) {
|
||||
dprint_bsg_err(mrioc, "%s: invalid buffer entries passed\n",
|
||||
__func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2454,12 +2470,14 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
if (sgl_dout_iter > (dout_buf + job->request_payload.payload_len)) {
|
||||
dprint_bsg_err(mrioc, "%s: data_out buffer length mismatch\n",
|
||||
__func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (sgl_din_iter > (din_buf + job->reply_payload.payload_len)) {
|
||||
dprint_bsg_err(mrioc, "%s: data_in buffer length mismatch\n",
|
||||
__func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2472,6 +2490,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
dprint_bsg_err(mrioc, "%s:%d: invalid data transfer size passed for function 0x%x din_size = %d, dout_size = %d\n",
|
||||
__func__, __LINE__, mpi_header->function, din_size,
|
||||
dout_size);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2480,6 +2499,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
dprint_bsg_err(mrioc,
|
||||
"%s:%d: invalid data transfer size passed for function 0x%x din_size=%d\n",
|
||||
__func__, __LINE__, mpi_header->function, din_size);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2487,6 +2507,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
dprint_bsg_err(mrioc,
|
||||
"%s:%d: invalid data transfer size passed for function 0x%x dout_size = %d\n",
|
||||
__func__, __LINE__, mpi_header->function, dout_size);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2497,6 +2518,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
dprint_bsg_err(mrioc, "%s:%d: invalid message size passed:%d:%d:%d:%d\n",
|
||||
__func__, __LINE__, din_cnt, dout_cnt, din_size,
|
||||
dout_size);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
rval = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@@ -2544,6 +2566,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
continue;
|
||||
if (mpi3mr_map_data_buffer_dma(mrioc, drv_buf_iter, desc_count)) {
|
||||
rval = -ENOMEM;
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
dprint_bsg_err(mrioc, "%s:%d: mapping data buffers failed\n",
|
||||
__func__, __LINE__);
|
||||
goto out;
|
||||
@@ -2556,20 +2579,11 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
|
||||
sense_buff_k = kzalloc(erbsz, GFP_KERNEL);
|
||||
if (!sense_buff_k) {
|
||||
rval = -ENOMEM;
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (mutex_lock_interruptible(&mrioc->bsg_cmds.mutex)) {
|
||||
rval = -ERESTARTSYS;
|
||||
goto out;
|
||||
}
|
||||
if (mrioc->bsg_cmds.state & MPI3MR_CMD_PENDING) {
|
||||
rval = -EAGAIN;
|
||||
dprint_bsg_err(mrioc, "%s: command is in use\n", __func__);
|
||||
mutex_unlock(&mrioc->bsg_cmds.mutex);
|
||||
goto out;
|
||||
}
|
||||
if (mrioc->unrecoverable) {
|
||||
dprint_bsg_err(mrioc, "%s: unrecoverable controller\n",
|
||||
__func__);
|
||||
|
||||
@@ -1035,6 +1035,36 @@ static const char *mpi3mr_reset_type_name(u16 reset_type)
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_is_fault_recoverable - Read fault code and decide
|
||||
* whether the controller can be recoverable
|
||||
* @mrioc: Adapter instance reference
|
||||
* Return: true if fault is recoverable, false otherwise.
|
||||
*/
|
||||
static inline bool mpi3mr_is_fault_recoverable(struct mpi3mr_ioc *mrioc)
|
||||
{
|
||||
u32 fault;
|
||||
|
||||
fault = (readl(&mrioc->sysif_regs->fault) &
|
||||
MPI3_SYSIF_FAULT_CODE_MASK);
|
||||
|
||||
switch (fault) {
|
||||
case MPI3_SYSIF_FAULT_CODE_COMPLETE_RESET_NEEDED:
|
||||
case MPI3_SYSIF_FAULT_CODE_POWER_CYCLE_REQUIRED:
|
||||
ioc_warn(mrioc,
|
||||
"controller requires system power cycle, marking controller as unrecoverable\n");
|
||||
return false;
|
||||
case MPI3_SYSIF_FAULT_CODE_INSUFFICIENT_PCI_SLOT_POWER:
|
||||
ioc_warn(mrioc,
|
||||
"controller faulted due to insufficient power,\n"
|
||||
" try by connecting it to a different slot\n");
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_print_fault_info - Display fault information
|
||||
* @mrioc: Adapter instance reference
|
||||
@@ -1373,6 +1403,11 @@ retry_bring_ioc_ready:
|
||||
ioc_info(mrioc, "ioc_status(0x%08x), ioc_config(0x%08x), ioc_info(0x%016llx) at the bringup\n",
|
||||
ioc_status, ioc_config, base_info);
|
||||
|
||||
if (!mpi3mr_is_fault_recoverable(mrioc)) {
|
||||
mrioc->unrecoverable = 1;
|
||||
goto out_device_not_present;
|
||||
}
|
||||
|
||||
/*The timeout value is in 2sec unit, changing it to seconds*/
|
||||
mrioc->ready_timeout =
|
||||
((base_info & MPI3_SYSIF_IOC_INFO_LOW_TIMEOUT_MASK) >>
|
||||
@@ -2734,6 +2769,11 @@ static void mpi3mr_watchdog_work(struct work_struct *work)
|
||||
mpi3mr_print_fault_info(mrioc);
|
||||
mrioc->diagsave_timeout = 0;
|
||||
|
||||
if (!mpi3mr_is_fault_recoverable(mrioc)) {
|
||||
mrioc->unrecoverable = 1;
|
||||
goto schedule_work;
|
||||
}
|
||||
|
||||
switch (trigger_data.fault) {
|
||||
case MPI3_SYSIF_FAULT_CODE_COMPLETE_RESET_NEEDED:
|
||||
case MPI3_SYSIF_FAULT_CODE_POWER_CYCLE_REQUIRED:
|
||||
@@ -4186,17 +4226,6 @@ retry_init:
|
||||
mpi3mr_read_tsu_interval(mrioc);
|
||||
mpi3mr_print_ioc_info(mrioc);
|
||||
|
||||
if (!mrioc->cfg_page) {
|
||||
dprint_init(mrioc, "allocating config page buffers\n");
|
||||
mrioc->cfg_page_sz = MPI3MR_DEFAULT_CFG_PAGE_SZ;
|
||||
mrioc->cfg_page = dma_alloc_coherent(&mrioc->pdev->dev,
|
||||
mrioc->cfg_page_sz, &mrioc->cfg_page_dma, GFP_KERNEL);
|
||||
if (!mrioc->cfg_page) {
|
||||
retval = -1;
|
||||
goto out_failed_noretry;
|
||||
}
|
||||
}
|
||||
|
||||
dprint_init(mrioc, "allocating host diag buffers\n");
|
||||
mpi3mr_alloc_diag_bufs(mrioc);
|
||||
|
||||
@@ -4768,11 +4797,7 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc)
|
||||
mrioc->admin_req_base, mrioc->admin_req_dma);
|
||||
mrioc->admin_req_base = NULL;
|
||||
}
|
||||
if (mrioc->cfg_page) {
|
||||
dma_free_coherent(&mrioc->pdev->dev, mrioc->cfg_page_sz,
|
||||
mrioc->cfg_page, mrioc->cfg_page_dma);
|
||||
mrioc->cfg_page = NULL;
|
||||
}
|
||||
|
||||
if (mrioc->pel_seqnum_virt) {
|
||||
dma_free_coherent(&mrioc->pdev->dev, mrioc->pel_seqnum_sz,
|
||||
mrioc->pel_seqnum_virt, mrioc->pel_seqnum_dma);
|
||||
@@ -5392,55 +5417,6 @@ out:
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* mpi3mr_free_config_dma_memory - free memory for config page
|
||||
* @mrioc: Adapter instance reference
|
||||
* @mem_desc: memory descriptor structure
|
||||
*
|
||||
* Check whether the size of the buffer specified by the memory
|
||||
* descriptor is greater than the default page size if so then
|
||||
* free the memory pointed by the descriptor.
|
||||
*
|
||||
* Return: Nothing.
|
||||
*/
|
||||
static void mpi3mr_free_config_dma_memory(struct mpi3mr_ioc *mrioc,
|
||||
struct dma_memory_desc *mem_desc)
|
||||
{
|
||||
if ((mem_desc->size > mrioc->cfg_page_sz) && mem_desc->addr) {
|
||||
dma_free_coherent(&mrioc->pdev->dev, mem_desc->size,
|
||||
mem_desc->addr, mem_desc->dma_addr);
|
||||
mem_desc->addr = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_alloc_config_dma_memory - Alloc memory for config page
|
||||
* @mrioc: Adapter instance reference
|
||||
* @mem_desc: Memory descriptor to hold dma memory info
|
||||
*
|
||||
* This function allocates new dmaable memory or provides the
|
||||
* default config page dmaable memory based on the memory size
|
||||
* described by the descriptor.
|
||||
*
|
||||
* Return: 0 on success, non-zero on failure.
|
||||
*/
|
||||
static int mpi3mr_alloc_config_dma_memory(struct mpi3mr_ioc *mrioc,
|
||||
struct dma_memory_desc *mem_desc)
|
||||
{
|
||||
if (mem_desc->size > mrioc->cfg_page_sz) {
|
||||
mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev,
|
||||
mem_desc->size, &mem_desc->dma_addr, GFP_KERNEL);
|
||||
if (!mem_desc->addr)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
mem_desc->addr = mrioc->cfg_page;
|
||||
mem_desc->dma_addr = mrioc->cfg_page_dma;
|
||||
memset(mem_desc->addr, 0, mrioc->cfg_page_sz);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mpi3mr_post_cfg_req - Issue config requests and wait
|
||||
* @mrioc: Adapter instance reference
|
||||
@@ -5596,8 +5572,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,
|
||||
cfg_req->page_length = cfg_hdr->page_length;
|
||||
cfg_req->page_version = cfg_hdr->page_version;
|
||||
}
|
||||
if (mpi3mr_alloc_config_dma_memory(mrioc, &mem_desc))
|
||||
goto out;
|
||||
|
||||
mem_desc.addr = dma_alloc_coherent(&mrioc->pdev->dev,
|
||||
mem_desc.size, &mem_desc.dma_addr, GFP_KERNEL);
|
||||
|
||||
if (!mem_desc.addr)
|
||||
return retval;
|
||||
|
||||
mpi3mr_add_sg_single(&cfg_req->sgl, sgl_flags, mem_desc.size,
|
||||
mem_desc.dma_addr);
|
||||
@@ -5626,7 +5606,12 @@ static int mpi3mr_process_cfg_req(struct mpi3mr_ioc *mrioc,
|
||||
}
|
||||
|
||||
out:
|
||||
mpi3mr_free_config_dma_memory(mrioc, &mem_desc);
|
||||
if (mem_desc.addr) {
|
||||
dma_free_coherent(&mrioc->pdev->dev, mem_desc.size,
|
||||
mem_desc.addr, mem_desc.dma_addr);
|
||||
mem_desc.addr = NULL;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
@@ -5215,7 +5215,7 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
}
|
||||
|
||||
mrioc = shost_priv(shost);
|
||||
retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL);
|
||||
retval = ida_alloc_range(&mrioc_ida, 0, U8_MAX, GFP_KERNEL);
|
||||
if (retval < 0)
|
||||
goto id_alloc_failed;
|
||||
mrioc->id = (u8)retval;
|
||||
|
||||
@@ -7040,11 +7040,12 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
|
||||
int i;
|
||||
u8 failed;
|
||||
__le32 *mfp;
|
||||
int ret_val;
|
||||
|
||||
/* make sure doorbell is not in use */
|
||||
if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
|
||||
ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__);
|
||||
return -EFAULT;
|
||||
goto doorbell_diag_reset;
|
||||
}
|
||||
|
||||
/* clear pending doorbell interrupts from previous state changes */
|
||||
@@ -7134,6 +7135,10 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
|
||||
le32_to_cpu(mfp[i]));
|
||||
}
|
||||
return 0;
|
||||
|
||||
doorbell_diag_reset:
|
||||
ret_val = _base_diag_reset(ioc);
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -77,11 +77,11 @@
|
||||
#define MPT3SAS_DRIVER_NAME "mpt3sas"
|
||||
#define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>"
|
||||
#define MPT3SAS_DESCRIPTION "LSI MPT Fusion SAS 3.0 Device Driver"
|
||||
#define MPT3SAS_DRIVER_VERSION "48.100.00.00"
|
||||
#define MPT3SAS_MAJOR_VERSION 48
|
||||
#define MPT3SAS_DRIVER_VERSION "51.100.00.00"
|
||||
#define MPT3SAS_MAJOR_VERSION 51
|
||||
#define MPT3SAS_MINOR_VERSION 100
|
||||
#define MPT3SAS_BUILD_VERSION 0
|
||||
#define MPT3SAS_RELEASE_VERSION 00
|
||||
#define MPT3SAS_BUILD_VERSION 00
|
||||
#define MPT3SAS_RELEASE_VERSION 00
|
||||
|
||||
#define MPT2SAS_DRIVER_NAME "mpt2sas"
|
||||
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
|
||||
|
||||
@@ -116,12 +116,12 @@ struct device_reg {
|
||||
uint16_t id_h; /* ID high */
|
||||
uint16_t cfg_0; /* Configuration 0 */
|
||||
#define ISP_CFG0_HWMSK 0x000f /* Hardware revision mask */
|
||||
#define ISP_CFG0_1020 BIT_0 /* ISP1020 */
|
||||
#define ISP_CFG0_1020A BIT_1 /* ISP1020A */
|
||||
#define ISP_CFG0_1040 BIT_2 /* ISP1040 */
|
||||
#define ISP_CFG0_1040A BIT_3 /* ISP1040A */
|
||||
#define ISP_CFG0_1040B BIT_4 /* ISP1040B */
|
||||
#define ISP_CFG0_1040C BIT_5 /* ISP1040C */
|
||||
#define ISP_CFG0_1020 1 /* ISP1020 */
|
||||
#define ISP_CFG0_1020A 2 /* ISP1020A */
|
||||
#define ISP_CFG0_1040 3 /* ISP1040 */
|
||||
#define ISP_CFG0_1040A 4 /* ISP1040A */
|
||||
#define ISP_CFG0_1040B 5 /* ISP1040B */
|
||||
#define ISP_CFG0_1040C 6 /* ISP1040C */
|
||||
uint16_t cfg_1; /* Configuration 1 */
|
||||
#define ISP_CFG1_F128 BIT_6 /* 128-byte FIFO threshold */
|
||||
#define ISP_CFG1_F64 BIT_4|BIT_5 /* 128-byte FIFO threshold */
|
||||
|
||||
@@ -3304,6 +3304,7 @@ struct fc_function_template qla2xxx_transport_vport_functions = {
|
||||
.show_host_node_name = 1,
|
||||
.show_host_port_name = 1,
|
||||
.show_host_supported_classes = 1,
|
||||
.show_host_supported_speeds = 1,
|
||||
|
||||
.get_host_port_id = qla2x00_get_host_port_id,
|
||||
.show_host_port_id = 1,
|
||||
|
||||
@@ -24,6 +24,7 @@ void qla2x00_bsg_job_done(srb_t *sp, int res)
|
||||
{
|
||||
struct bsg_job *bsg_job = sp->u.bsg_job;
|
||||
struct fc_bsg_reply *bsg_reply = bsg_job->reply;
|
||||
struct completion *comp = sp->comp;
|
||||
|
||||
ql_dbg(ql_dbg_user, sp->vha, 0x7009,
|
||||
"%s: sp hdl %x, result=%x bsg ptr %p\n",
|
||||
@@ -35,6 +36,9 @@ void qla2x00_bsg_job_done(srb_t *sp, int res)
|
||||
bsg_reply->result = res;
|
||||
bsg_job_done(bsg_job, bsg_reply->result,
|
||||
bsg_reply->reply_payload_rcv_len);
|
||||
|
||||
if (comp)
|
||||
complete(comp);
|
||||
}
|
||||
|
||||
void qla2x00_bsg_sp_free(srb_t *sp)
|
||||
@@ -490,16 +494,6 @@ qla2x00_process_ct(struct bsg_job *bsg_job)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ((req_sg_cnt != bsg_job->request_payload.sg_cnt) ||
|
||||
(rsp_sg_cnt != bsg_job->reply_payload.sg_cnt)) {
|
||||
ql_log(ql_log_warn, vha, 0x7011,
|
||||
"request_sg_cnt: %x dma_request_sg_cnt: %x reply_sg_cnt:%x "
|
||||
"dma_reply_sg_cnt: %x\n", bsg_job->request_payload.sg_cnt,
|
||||
req_sg_cnt, bsg_job->reply_payload.sg_cnt, rsp_sg_cnt);
|
||||
rval = -EAGAIN;
|
||||
goto done_unmap_sg;
|
||||
}
|
||||
|
||||
if (!vha->flags.online) {
|
||||
ql_log(ql_log_warn, vha, 0x7012,
|
||||
"Host is not online.\n");
|
||||
@@ -3061,7 +3055,7 @@ skip_chip_chk:
|
||||
|
||||
static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)
|
||||
{
|
||||
bool found = false;
|
||||
bool found, do_bsg_done;
|
||||
struct fc_bsg_reply *bsg_reply = bsg_job->reply;
|
||||
scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
@@ -3069,6 +3063,11 @@ static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)
|
||||
int cnt;
|
||||
unsigned long flags;
|
||||
struct req_que *req;
|
||||
int rval;
|
||||
DECLARE_COMPLETION_ONSTACK(comp);
|
||||
uint32_t ratov_j;
|
||||
|
||||
found = do_bsg_done = false;
|
||||
|
||||
spin_lock_irqsave(qpair->qp_lock_ptr, flags);
|
||||
req = qpair->req;
|
||||
@@ -3080,42 +3079,104 @@ static bool qla_bsg_found(struct qla_qpair *qpair, struct bsg_job *bsg_job)
|
||||
sp->type == SRB_ELS_CMD_HST ||
|
||||
sp->type == SRB_ELS_CMD_HST_NOLOGIN) &&
|
||||
sp->u.bsg_job == bsg_job) {
|
||||
req->outstanding_cmds[cnt] = NULL;
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
|
||||
if (!ha->flags.eeh_busy && ha->isp_ops->abort_command(sp)) {
|
||||
ql_log(ql_log_warn, vha, 0x7089,
|
||||
"mbx abort_command failed.\n");
|
||||
bsg_reply->result = -EIO;
|
||||
} else {
|
||||
ql_dbg(ql_dbg_user, vha, 0x708a,
|
||||
"mbx abort_command success.\n");
|
||||
bsg_reply->result = 0;
|
||||
}
|
||||
/* ref: INIT */
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
|
||||
found = true;
|
||||
goto done;
|
||||
sp->comp = ∁
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
|
||||
done:
|
||||
return found;
|
||||
if (!found)
|
||||
return false;
|
||||
|
||||
if (ha->flags.eeh_busy) {
|
||||
/* skip over abort. EEH handling will return the bsg. Wait for it */
|
||||
rval = QLA_SUCCESS;
|
||||
ql_dbg(ql_dbg_user, vha, 0x802c,
|
||||
"eeh encounter. bsg %p sp=%p handle=%x \n",
|
||||
bsg_job, sp, sp->handle);
|
||||
} else {
|
||||
rval = ha->isp_ops->abort_command(sp);
|
||||
ql_dbg(ql_dbg_user, vha, 0x802c,
|
||||
"Aborting bsg %p sp=%p handle=%x rval=%x\n",
|
||||
bsg_job, sp, sp->handle, rval);
|
||||
}
|
||||
|
||||
switch (rval) {
|
||||
case QLA_SUCCESS:
|
||||
/* Wait for the command completion. */
|
||||
ratov_j = ha->r_a_tov / 10 * 4 * 1000;
|
||||
ratov_j = msecs_to_jiffies(ratov_j);
|
||||
|
||||
if (!wait_for_completion_timeout(&comp, ratov_j)) {
|
||||
ql_log(ql_log_info, vha, 0x7089,
|
||||
"bsg abort timeout. bsg=%p sp=%p handle %#x .\n",
|
||||
bsg_job, sp, sp->handle);
|
||||
|
||||
do_bsg_done = true;
|
||||
} else {
|
||||
/* fw had returned the bsg */
|
||||
ql_dbg(ql_dbg_user, vha, 0x708a,
|
||||
"bsg abort success. bsg %p sp=%p handle=%#x\n",
|
||||
bsg_job, sp, sp->handle);
|
||||
do_bsg_done = false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ql_log(ql_log_info, vha, 0x704f,
|
||||
"bsg abort fail. bsg=%p sp=%p rval=%x.\n",
|
||||
bsg_job, sp, rval);
|
||||
|
||||
do_bsg_done = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!do_bsg_done)
|
||||
return true;
|
||||
|
||||
spin_lock_irqsave(qpair->qp_lock_ptr, flags);
|
||||
/*
|
||||
* recheck to make sure it's still the same bsg_job due to
|
||||
* qp_lock_ptr was released earlier.
|
||||
*/
|
||||
if (req->outstanding_cmds[cnt] &&
|
||||
req->outstanding_cmds[cnt]->u.bsg_job != bsg_job) {
|
||||
/* fw had returned the bsg */
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
return true;
|
||||
}
|
||||
req->outstanding_cmds[cnt] = NULL;
|
||||
spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
|
||||
|
||||
/* ref: INIT */
|
||||
sp->comp = NULL;
|
||||
kref_put(&sp->cmd_kref, qla2x00_sp_release);
|
||||
bsg_reply->result = -ENXIO;
|
||||
bsg_reply->reply_payload_rcv_len = 0;
|
||||
|
||||
ql_dbg(ql_dbg_user, vha, 0x7051,
|
||||
"%s bsg_job_done : bsg %p result %#x sp %p.\n",
|
||||
__func__, bsg_job, bsg_reply->result, sp);
|
||||
|
||||
bsg_job_done(bsg_job, bsg_reply->result, bsg_reply->reply_payload_rcv_len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
qla24xx_bsg_timeout(struct bsg_job *bsg_job)
|
||||
{
|
||||
struct fc_bsg_reply *bsg_reply = bsg_job->reply;
|
||||
struct fc_bsg_request *bsg_request = bsg_job->request;
|
||||
scsi_qla_host_t *vha = shost_priv(fc_bsg_to_shost(bsg_job));
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int i;
|
||||
struct qla_qpair *qpair;
|
||||
|
||||
ql_log(ql_log_info, vha, 0x708b, "%s CMD timeout. bsg ptr %p.\n",
|
||||
__func__, bsg_job);
|
||||
ql_log(ql_log_info, vha, 0x708b,
|
||||
"%s CMD timeout. bsg ptr %p msgcode %x vendor cmd %x\n",
|
||||
__func__, bsg_job, bsg_request->msgcode,
|
||||
bsg_request->rqst_data.h_vendor.vendor_cmd[0]);
|
||||
|
||||
if (qla2x00_isp_reg_stat(ha)) {
|
||||
ql_log(ql_log_info, vha, 0x9007,
|
||||
@@ -3136,7 +3197,6 @@ qla24xx_bsg_timeout(struct bsg_job *bsg_job)
|
||||
}
|
||||
|
||||
ql_log(ql_log_info, vha, 0x708b, "SRB not found to abort.\n");
|
||||
bsg_reply->result = -ENXIO;
|
||||
|
||||
done:
|
||||
return 0;
|
||||
|
||||
@@ -506,6 +506,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
vha->irq_offset = QLA_BASE_VECTORS;
|
||||
host = vha->host;
|
||||
fc_vport->dd_data = vha;
|
||||
/* New host info */
|
||||
|
||||
@@ -6902,12 +6902,15 @@ qla2x00_do_dpc(void *data)
|
||||
set_user_nice(current, MIN_NICE);
|
||||
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
while (!kthread_should_stop()) {
|
||||
while (1) {
|
||||
ql_dbg(ql_dbg_dpc, base_vha, 0x4000,
|
||||
"DPC handler sleeping.\n");
|
||||
|
||||
schedule();
|
||||
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
|
||||
if (test_and_clear_bit(DO_EEH_RECOVERY, &base_vha->dpc_flags))
|
||||
qla_pci_set_eeh_busy(base_vha);
|
||||
|
||||
@@ -6920,15 +6923,16 @@ qla2x00_do_dpc(void *data)
|
||||
goto end_loop;
|
||||
}
|
||||
|
||||
if (test_bit(UNLOADING, &base_vha->dpc_flags))
|
||||
/* don't do any work. Wait to be terminated by kthread_stop */
|
||||
goto end_loop;
|
||||
|
||||
ha->dpc_active = 1;
|
||||
|
||||
ql_dbg(ql_dbg_dpc + ql_dbg_verbose, base_vha, 0x4001,
|
||||
"DPC handler waking up, dpc_flags=0x%lx.\n",
|
||||
base_vha->dpc_flags);
|
||||
|
||||
if (test_bit(UNLOADING, &base_vha->dpc_flags))
|
||||
break;
|
||||
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (IS_QLA8044(ha)) {
|
||||
if (test_and_clear_bit(ISP_UNRECOVERABLE,
|
||||
@@ -7241,9 +7245,6 @@ end_loop:
|
||||
*/
|
||||
ha->dpc_active = 0;
|
||||
|
||||
/* Cleanup any residual CTX SRBs. */
|
||||
qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
/*
|
||||
* Driver version
|
||||
*/
|
||||
#define QLA2XXX_VERSION "10.02.09.300-k"
|
||||
#define QLA2XXX_VERSION "10.02.09.400-k"
|
||||
|
||||
#define QLA_DRIVER_MAJOR_VER 10
|
||||
#define QLA_DRIVER_MINOR_VER 2
|
||||
#define QLA_DRIVER_PATCH_VER 9
|
||||
#define QLA_DRIVER_BETA_VER 300
|
||||
#define QLA_DRIVER_BETA_VER 400
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user