Skip to content

Commit 2a5a432

Browse files
committed
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull more SCSI updates from James Bottomley: "Mostly small stragglers that missed the initial merge. Driver updates are qla2xxx and smartpqi (mp3sas has a high diffstat due to the volatile qualifier removal, fnic due to unused function removal and sd.c has a lot of code shuffling to remove forward declarations)" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (38 commits) scsi: ufs: core: No need to update UPIU.header.flags and lun in advanced RPMB handler scsi: ufs: core: Add advanced RPMB support where UFSHCI 4.0 does not support EHS length in UTRD scsi: mpt3sas: Remove volatile qualifier scsi: mpt3sas: Perform additional retries if doorbell read returns 0 scsi: libsas: Simplify sas_queue_reset() and remove unused code scsi: ufs: Fix the build for the old ARM OABI scsi: qla2xxx: Fix unused variable warning in qla2xxx_process_purls_pkt() scsi: fnic: Remove unused functions fnic_scsi_host_start/end_tag() scsi: qla2xxx: Fix spelling mistake "tranport" -> "transport" scsi: fnic: Replace sgreset tag with max_tag_id scsi: qla2xxx: Remove unused variables in qla24xx_build_scsi_type_6_iocbs() scsi: qla2xxx: Fix nvme_fc_rcv_ls_req() undefined error scsi: smartpqi: Change driver version to 2.1.24-046 scsi: smartpqi: Enhance error messages scsi: smartpqi: Enhance controller offline notification scsi: smartpqi: Enhance shutdown notification scsi: smartpqi: Simplify lun_number assignment scsi: smartpqi: Rename pciinfo to pci_info scsi: smartpqi: Rename MACRO to clarify purpose scsi: smartpqi: Add abort handler ...
2 parents 6b41fb2 + 9f6fec6 commit 2a5a432

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1433
-319
lines changed

drivers/ata/libata-scsi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4752,7 +4752,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
47524752
}
47534753

47544754
spin_unlock_irqrestore(ap->lock, flags);
4755-
scsi_rescan_device(&(sdev->sdev_gendev));
4755+
scsi_rescan_device(sdev);
47564756
scsi_device_put(sdev);
47574757
spin_lock_irqsave(ap->lock, flags);
47584758
}

drivers/scsi/aacraid/commsup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1451,7 +1451,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
14511451
#endif
14521452
break;
14531453
}
1454-
scsi_rescan_device(&device->sdev_gendev);
1454+
scsi_rescan_device(device);
14551455
break;
14561456

14571457
default:

drivers/scsi/fnic/fnic.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
#define DRV_NAME "fnic"
2929
#define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
30-
#define DRV_VERSION "1.6.0.55"
30+
#define DRV_VERSION "1.6.0.56"
3131
#define PFX DRV_NAME ": "
3232
#define DFX DRV_NAME "%d: "
3333

@@ -236,6 +236,7 @@ struct fnic {
236236
unsigned int wq_count;
237237
unsigned int cq_count;
238238

239+
struct mutex sgreset_mutex;
239240
struct dentry *fnic_stats_debugfs_host;
240241
struct dentry *fnic_stats_debugfs_file;
241242
struct dentry *fnic_reset_debugfs_file;

drivers/scsi/fnic/fnic_scsi.c

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2167,39 +2167,6 @@ static int fnic_clean_pending_aborts(struct fnic *fnic,
21672167
return ret;
21682168
}
21692169

2170-
/*
2171-
* fnic_scsi_host_start_tag
2172-
* Allocates tagid from host's tag list
2173-
**/
2174-
static inline int
2175-
fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc)
2176-
{
2177-
struct request *rq = scsi_cmd_to_rq(sc);
2178-
struct request_queue *q = rq->q;
2179-
struct request *dummy;
2180-
2181-
dummy = blk_mq_alloc_request(q, REQ_OP_WRITE, BLK_MQ_REQ_NOWAIT);
2182-
if (IS_ERR(dummy))
2183-
return SCSI_NO_TAG;
2184-
2185-
rq->tag = dummy->tag;
2186-
sc->host_scribble = (unsigned char *)dummy;
2187-
2188-
return dummy->tag;
2189-
}
2190-
2191-
/*
2192-
* fnic_scsi_host_end_tag
2193-
* frees tag allocated by fnic_scsi_host_start_tag.
2194-
**/
2195-
static inline void
2196-
fnic_scsi_host_end_tag(struct fnic *fnic, struct scsi_cmnd *sc)
2197-
{
2198-
struct request *dummy = (struct request *)sc->host_scribble;
2199-
2200-
blk_mq_free_request(dummy);
2201-
}
2202-
22032170
/*
22042171
* SCSI Eh thread issues a Lun Reset when one or more commands on a LUN
22052172
* fail to get aborted. It calls driver's eh_device_reset with a SCSI command
@@ -2222,7 +2189,6 @@ int fnic_device_reset(struct scsi_cmnd *sc)
22222189
struct reset_stats *reset_stats;
22232190
int tag = rq->tag;
22242191
DECLARE_COMPLETION_ONSTACK(tm_done);
2225-
int tag_gen_flag = 0; /*to track tags allocated by fnic driver*/
22262192
bool new_sc = 0;
22272193

22282194
/* Wait for rport to unblock */
@@ -2252,17 +2218,17 @@ int fnic_device_reset(struct scsi_cmnd *sc)
22522218
}
22532219

22542220
fnic_priv(sc)->flags = FNIC_DEVICE_RESET;
2255-
/* Allocate tag if not present */
22562221

22572222
if (unlikely(tag < 0)) {
22582223
/*
2259-
* Really should fix the midlayer to pass in a proper
2260-
* request for ioctls...
2224+
* For device reset issued through sg3utils, we let
2225+
* only one LUN_RESET to go through and use a special
2226+
* tag equal to max_tag_id so that we don't have to allocate
2227+
* or free it. It won't interact with tags
2228+
* allocated by mid layer.
22612229
*/
2262-
tag = fnic_scsi_host_start_tag(fnic, sc);
2263-
if (unlikely(tag == SCSI_NO_TAG))
2264-
goto fnic_device_reset_end;
2265-
tag_gen_flag = 1;
2230+
mutex_lock(&fnic->sgreset_mutex);
2231+
tag = fnic->fnic_max_tag_id;
22662232
new_sc = 1;
22672233
}
22682234
io_lock = fnic_io_lock_hash(fnic, sc);
@@ -2434,9 +2400,8 @@ int fnic_device_reset(struct scsi_cmnd *sc)
24342400
(u64)sc->cmnd[4] << 8 | sc->cmnd[5]),
24352401
fnic_flags_and_state(sc));
24362402

2437-
/* free tag if it is allocated */
2438-
if (unlikely(tag_gen_flag))
2439-
fnic_scsi_host_end_tag(fnic, sc);
2403+
if (new_sc)
2404+
mutex_unlock(&fnic->sgreset_mutex);
24402405

24412406
FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
24422407
"Returning from device reset %s\n",

drivers/scsi/libsas/sas_scsi_host.c

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -386,46 +386,14 @@ struct sas_phy *sas_get_local_phy(struct domain_device *dev)
386386
}
387387
EXPORT_SYMBOL_GPL(sas_get_local_phy);
388388

389-
static void sas_wait_eh(struct domain_device *dev)
390-
{
391-
struct sas_ha_struct *ha = dev->port->ha;
392-
DEFINE_WAIT(wait);
393-
394-
if (dev_is_sata(dev)) {
395-
ata_port_wait_eh(dev->sata_dev.ap);
396-
return;
397-
}
398-
retry:
399-
spin_lock_irq(&ha->lock);
400-
401-
while (test_bit(SAS_DEV_EH_PENDING, &dev->state)) {
402-
prepare_to_wait(&ha->eh_wait_q, &wait, TASK_UNINTERRUPTIBLE);
403-
spin_unlock_irq(&ha->lock);
404-
schedule();
405-
spin_lock_irq(&ha->lock);
406-
}
407-
finish_wait(&ha->eh_wait_q, &wait);
408-
409-
spin_unlock_irq(&ha->lock);
410-
411-
/* make sure SCSI EH is complete */
412-
if (scsi_host_in_recovery(ha->shost)) {
413-
msleep(10);
414-
goto retry;
415-
}
416-
}
417-
418-
static int sas_queue_reset(struct domain_device *dev, int reset_type,
419-
u64 lun, int wait)
389+
static int sas_queue_reset(struct domain_device *dev, int reset_type, u64 lun)
420390
{
421391
struct sas_ha_struct *ha = dev->port->ha;
422392
int scheduled = 0, tries = 100;
423393

424394
/* ata: promote lun reset to bus reset */
425395
if (dev_is_sata(dev)) {
426396
sas_ata_schedule_reset(dev);
427-
if (wait)
428-
sas_ata_wait_eh(dev);
429397
return SUCCESS;
430398
}
431399

@@ -443,9 +411,6 @@ static int sas_queue_reset(struct domain_device *dev, int reset_type,
443411
}
444412
spin_unlock_irq(&ha->lock);
445413

446-
if (wait)
447-
sas_wait_eh(dev);
448-
449414
if (scheduled)
450415
return SUCCESS;
451416
}
@@ -498,7 +463,7 @@ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
498463
struct sas_internal *i = to_sas_internal(host->transportt);
499464

500465
if (current != host->ehandler)
501-
return sas_queue_reset(dev, SAS_DEV_LU_RESET, cmd->device->lun, 0);
466+
return sas_queue_reset(dev, SAS_DEV_LU_RESET, cmd->device->lun);
502467

503468
int_to_scsilun(cmd->device->lun, &lun);
504469

@@ -521,7 +486,7 @@ int sas_eh_target_reset_handler(struct scsi_cmnd *cmd)
521486
struct sas_internal *i = to_sas_internal(host->transportt);
522487

523488
if (current != host->ehandler)
524-
return sas_queue_reset(dev, SAS_DEV_RESET, 0, 0);
489+
return sas_queue_reset(dev, SAS_DEV_RESET, 0);
525490

526491
if (!i->dft->lldd_I_T_nexus_reset)
527492
return FAILED;

drivers/scsi/mpt3sas/mpi/mpi2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@
199199
*
200200
*****************************************************************************/
201201

202-
typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS {
202+
typedef struct _MPI2_SYSTEM_INTERFACE_REGS {
203203
U32 Doorbell; /*0x00 */
204204
U32 WriteSequence; /*0x04 */
205205
U32 HostDiagnostic; /*0x08 */

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ _base_get_ioc_facts(struct MPT3SAS_ADAPTER *ioc);
138138
static void
139139
_base_clear_outstanding_commands(struct MPT3SAS_ADAPTER *ioc);
140140

141+
static u32
142+
_base_readl_ext_retry(const void __iomem *addr);
143+
141144
/**
142145
* mpt3sas_base_check_cmd_timeout - Function
143146
* to check timeout and command termination due
@@ -201,7 +204,7 @@ module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug,
201204
* while reading the system interface register.
202205
*/
203206
static inline u32
204-
_base_readl_aero(const volatile void __iomem *addr)
207+
_base_readl_aero(const void __iomem *addr)
205208
{
206209
u32 i = 0, ret_val;
207210

@@ -213,8 +216,22 @@ _base_readl_aero(const volatile void __iomem *addr)
213216
return ret_val;
214217
}
215218

219+
static u32
220+
_base_readl_ext_retry(const void __iomem *addr)
221+
{
222+
u32 i, ret_val;
223+
224+
for (i = 0 ; i < 30 ; i++) {
225+
ret_val = readl(addr);
226+
if (ret_val == 0)
227+
continue;
228+
}
229+
230+
return ret_val;
231+
}
232+
216233
static inline u32
217-
_base_readl(const volatile void __iomem *addr)
234+
_base_readl(const void __iomem *addr)
218235
{
219236
return readl(addr);
220237
}
@@ -940,7 +957,7 @@ mpt3sas_halt_firmware(struct MPT3SAS_ADAPTER *ioc)
940957

941958
dump_stack();
942959

943-
doorbell = ioc->base_readl(&ioc->chip->Doorbell);
960+
doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
944961
if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
945962
mpt3sas_print_fault_code(ioc, doorbell &
946963
MPI2_DOORBELL_DATA_MASK);
@@ -6686,7 +6703,7 @@ mpt3sas_base_get_iocstate(struct MPT3SAS_ADAPTER *ioc, int cooked)
66866703
{
66876704
u32 s, sc;
66886705

6689-
s = ioc->base_readl(&ioc->chip->Doorbell);
6706+
s = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
66906707
sc = s & MPI2_IOC_STATE_MASK;
66916708
return cooked ? sc : s;
66926709
}
@@ -6831,7 +6848,7 @@ _base_wait_for_doorbell_ack(struct MPT3SAS_ADAPTER *ioc, int timeout)
68316848
__func__, count, timeout));
68326849
return 0;
68336850
} else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) {
6834-
doorbell = ioc->base_readl(&ioc->chip->Doorbell);
6851+
doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
68356852
if ((doorbell & MPI2_IOC_STATE_MASK) ==
68366853
MPI2_IOC_STATE_FAULT) {
68376854
mpt3sas_print_fault_code(ioc, doorbell);
@@ -6871,7 +6888,7 @@ _base_wait_for_doorbell_not_used(struct MPT3SAS_ADAPTER *ioc, int timeout)
68716888
count = 0;
68726889
cntdn = 1000 * timeout;
68736890
do {
6874-
doorbell_reg = ioc->base_readl(&ioc->chip->Doorbell);
6891+
doorbell_reg = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
68756892
if (!(doorbell_reg & MPI2_DOORBELL_USED)) {
68766893
dhsprintk(ioc,
68776894
ioc_info(ioc, "%s: successful count(%d), timeout(%d)\n",
@@ -7019,7 +7036,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
70197036
__le32 *mfp;
70207037

70217038
/* make sure doorbell is not in use */
7022-
if ((ioc->base_readl(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
7039+
if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
70237040
ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__);
70247041
return -EFAULT;
70257042
}
@@ -7068,15 +7085,15 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
70687085
}
70697086

70707087
/* read the first two 16-bits, it gives the total length of the reply */
7071-
reply[0] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
7088+
reply[0] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
70727089
& MPI2_DOORBELL_DATA_MASK);
70737090
writel(0, &ioc->chip->HostInterruptStatus);
70747091
if ((_base_wait_for_doorbell_int(ioc, 5))) {
70757092
ioc_err(ioc, "doorbell handshake int failed (line=%d)\n",
70767093
__LINE__);
70777094
return -EFAULT;
70787095
}
7079-
reply[1] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
7096+
reply[1] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
70807097
& MPI2_DOORBELL_DATA_MASK);
70817098
writel(0, &ioc->chip->HostInterruptStatus);
70827099

@@ -7087,10 +7104,10 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
70877104
return -EFAULT;
70887105
}
70897106
if (i >= reply_bytes/2) /* overflow case */
7090-
ioc->base_readl(&ioc->chip->Doorbell);
7107+
ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
70917108
else
70927109
reply[i] = le16_to_cpu(
7093-
ioc->base_readl(&ioc->chip->Doorbell)
7110+
ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
70947111
& MPI2_DOORBELL_DATA_MASK);
70957112
writel(0, &ioc->chip->HostInterruptStatus);
70967113
}
@@ -7949,7 +7966,7 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
79497966
goto out;
79507967
}
79517968

7952-
host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
7969+
host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
79537970
drsprintk(ioc,
79547971
ioc_info(ioc, "wrote magic sequence: count(%d), host_diagnostic(0x%08x)\n",
79557972
count, host_diagnostic));
@@ -7969,7 +7986,7 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
79697986
for (count = 0; count < (300000000 /
79707987
MPI2_HARD_RESET_PCIE_SECOND_READ_DELAY_MICRO_SEC); count++) {
79717988

7972-
host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
7989+
host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
79737990

79747991
if (host_diagnostic == 0xFFFFFFFF) {
79757992
ioc_info(ioc,
@@ -8359,10 +8376,13 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
83598376
ioc->rdpq_array_enable_assigned = 0;
83608377
ioc->use_32bit_dma = false;
83618378
ioc->dma_mask = 64;
8362-
if (ioc->is_aero_ioc)
8379+
if (ioc->is_aero_ioc) {
83638380
ioc->base_readl = &_base_readl_aero;
8364-
else
8381+
ioc->base_readl_ext_retry = &_base_readl_ext_retry;
8382+
} else {
83658383
ioc->base_readl = &_base_readl;
8384+
ioc->base_readl_ext_retry = &_base_readl;
8385+
}
83668386
r = mpt3sas_base_map_resources(ioc);
83678387
if (r)
83688388
goto out_free_resources;

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -994,7 +994,7 @@ typedef void (*NVME_BUILD_PRP)(struct MPT3SAS_ADAPTER *ioc, u16 smid,
994994
typedef void (*PUT_SMID_IO_FP_HIP) (struct MPT3SAS_ADAPTER *ioc, u16 smid,
995995
u16 funcdep);
996996
typedef void (*PUT_SMID_DEFAULT) (struct MPT3SAS_ADAPTER *ioc, u16 smid);
997-
typedef u32 (*BASE_READ_REG) (const volatile void __iomem *addr);
997+
typedef u32 (*BASE_READ_REG) (const void __iomem *addr);
998998
/*
999999
* To get high iops reply queue's msix index when high iops mode is enabled
10001000
* else get the msix index of general reply queues.
@@ -1618,6 +1618,7 @@ struct MPT3SAS_ADAPTER {
16181618
u8 diag_trigger_active;
16191619
u8 atomic_desc_capable;
16201620
BASE_READ_REG base_readl;
1621+
BASE_READ_REG base_readl_ext_retry;
16211622
struct SL_WH_MASTER_TRIGGER_T diag_trigger_master;
16221623
struct SL_WH_EVENT_TRIGGERS_T diag_trigger_event;
16231624
struct SL_WH_SCSI_TRIGGERS_T diag_trigger_scsi;

drivers/scsi/mvumi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ static void mvumi_rescan_devices(struct mvumi_hba *mhba, int id)
15001500

15011501
sdev = scsi_device_lookup(mhba->shost, 0, id, 0);
15021502
if (sdev) {
1503-
scsi_rescan_device(&sdev->sdev_gendev);
1503+
scsi_rescan_device(sdev);
15041504
scsi_device_put(sdev);
15051505
}
15061506
}

drivers/scsi/qedf/qedf.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,6 @@ extern void qedf_get_generic_tlv_data(void *dev, struct qed_generic_tlvs *data);
548548
extern void qedf_wq_grcdump(struct work_struct *work);
549549
void qedf_stag_change_work(struct work_struct *work);
550550
void qedf_ctx_soft_reset(struct fc_lport *lport);
551-
extern void qedf_board_disable_work(struct work_struct *work);
552551
extern void qedf_schedule_hw_err_handler(void *dev,
553552
enum qed_hw_err_type err_type);
554553

0 commit comments

Comments
 (0)