SCSI misc on 20230506
Six late arriving patches for the merge window. Five are minor assorted fixes and updates. The IPR driver change removes SATA support, which will now allow a major cleanup in the ATA subsystem because it was the only driver still using the old attachment mechanism. The driver is only used on power systems and SATA was used to support a DVD device, which has long been moved to a different hba. IBM chose this route instead of porting ipr to the newer SATA interfaces. Signed-off-by: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCZFZGfiYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishbgIAP9V4dKN e5xLwf4q9+bKKCSCmlMrPeAnfJXyWdW6VWvWhQD9H4bgemsWhcUOztvpB2pOUpYx JaJCgj/MAA0FSXhy3Bk= =FwUd -----END PGP SIGNATURE----- Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull more SCSI updates from James Bottomley: "Six late arriving patches for the merge window. Five are minor assorted fixes and updates. The IPR driver change removes SATA support, which will now allow a major cleanup in the ATA subsystem because it was the only driver still using the old attachment mechanism. The driver is only used on power systems and SATA was used to support a DVD device, which has long been moved to a different hba. IBM chose this route instead of porting ipr to the newer SATA interfaces" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: qedi: Fix use after free bug in qedi_remove() scsi: ufs: core: mcq: Fix &hwq->cq_lock deadlock issue scsi: ipr: Remove several unused variables scsi: pm80xx: Log device registration scsi: ipr: Remove SATA support scsi: scsi_debug: Abort commands from scsi_debug_device_reset()
This commit is contained in:
Коммит
dd9e11d647
|
@ -971,8 +971,7 @@ config SCSI_SYM53C8XX_MMIO
|
||||||
|
|
||||||
config SCSI_IPR
|
config SCSI_IPR
|
||||||
tristate "IBM Power Linux RAID adapter support"
|
tristate "IBM Power Linux RAID adapter support"
|
||||||
depends on PCI && SCSI && ATA
|
depends on PCI && SCSI
|
||||||
select SATA_HOST
|
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
select IRQ_POLL
|
select IRQ_POLL
|
||||||
select SGL_ALLOC
|
select SGL_ALLOC
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -16,7 +16,6 @@
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/libata.h>
|
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
#include <linux/irq_poll.h>
|
#include <linux/irq_poll.h>
|
||||||
|
@ -35,7 +34,6 @@
|
||||||
* This can be adjusted at runtime through sysfs device attributes.
|
* This can be adjusted at runtime through sysfs device attributes.
|
||||||
*/
|
*/
|
||||||
#define IPR_MAX_CMD_PER_LUN 6
|
#define IPR_MAX_CMD_PER_LUN 6
|
||||||
#define IPR_MAX_CMD_PER_ATA_LUN 1
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of
|
* IPR_NUM_BASE_CMD_BLKS: This defines the maximum number of
|
||||||
|
@ -197,7 +195,6 @@
|
||||||
#define IPR_LUN_RESET 0x40
|
#define IPR_LUN_RESET 0x40
|
||||||
#define IPR_TARGET_RESET 0x20
|
#define IPR_TARGET_RESET 0x20
|
||||||
#define IPR_BUS_RESET 0x10
|
#define IPR_BUS_RESET 0x10
|
||||||
#define IPR_ATA_PHY_RESET 0x80
|
|
||||||
#define IPR_ID_HOST_RR_Q 0xC4
|
#define IPR_ID_HOST_RR_Q 0xC4
|
||||||
#define IPR_QUERY_IOA_CONFIG 0xC5
|
#define IPR_QUERY_IOA_CONFIG 0xC5
|
||||||
#define IPR_CANCEL_ALL_REQUESTS 0xCE
|
#define IPR_CANCEL_ALL_REQUESTS 0xCE
|
||||||
|
@ -521,7 +518,6 @@ struct ipr_cmd_pkt {
|
||||||
#define IPR_RQTYPE_SCSICDB 0x00
|
#define IPR_RQTYPE_SCSICDB 0x00
|
||||||
#define IPR_RQTYPE_IOACMD 0x01
|
#define IPR_RQTYPE_IOACMD 0x01
|
||||||
#define IPR_RQTYPE_HCAM 0x02
|
#define IPR_RQTYPE_HCAM 0x02
|
||||||
#define IPR_RQTYPE_ATA_PASSTHRU 0x04
|
|
||||||
#define IPR_RQTYPE_PIPE 0x05
|
#define IPR_RQTYPE_PIPE 0x05
|
||||||
|
|
||||||
u8 reserved2;
|
u8 reserved2;
|
||||||
|
@ -546,30 +542,6 @@ struct ipr_cmd_pkt {
|
||||||
__be16 timeout;
|
__be16 timeout;
|
||||||
}__attribute__ ((packed, aligned(4)));
|
}__attribute__ ((packed, aligned(4)));
|
||||||
|
|
||||||
struct ipr_ioarcb_ata_regs { /* 22 bytes */
|
|
||||||
u8 flags;
|
|
||||||
#define IPR_ATA_FLAG_PACKET_CMD 0x80
|
|
||||||
#define IPR_ATA_FLAG_XFER_TYPE_DMA 0x40
|
|
||||||
#define IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION 0x20
|
|
||||||
u8 reserved[3];
|
|
||||||
|
|
||||||
__be16 data;
|
|
||||||
u8 feature;
|
|
||||||
u8 nsect;
|
|
||||||
u8 lbal;
|
|
||||||
u8 lbam;
|
|
||||||
u8 lbah;
|
|
||||||
u8 device;
|
|
||||||
u8 command;
|
|
||||||
u8 reserved2[3];
|
|
||||||
u8 hob_feature;
|
|
||||||
u8 hob_nsect;
|
|
||||||
u8 hob_lbal;
|
|
||||||
u8 hob_lbam;
|
|
||||||
u8 hob_lbah;
|
|
||||||
u8 ctl;
|
|
||||||
}__attribute__ ((packed, aligned(2)));
|
|
||||||
|
|
||||||
struct ipr_ioadl_desc {
|
struct ipr_ioadl_desc {
|
||||||
__be32 flags_and_data_len;
|
__be32 flags_and_data_len;
|
||||||
#define IPR_IOADL_FLAGS_MASK 0xff000000
|
#define IPR_IOADL_FLAGS_MASK 0xff000000
|
||||||
|
@ -591,15 +563,8 @@ struct ipr_ioadl64_desc {
|
||||||
__be64 address;
|
__be64 address;
|
||||||
}__attribute__((packed, aligned (16)));
|
}__attribute__((packed, aligned (16)));
|
||||||
|
|
||||||
struct ipr_ata64_ioadl {
|
|
||||||
struct ipr_ioarcb_ata_regs regs;
|
|
||||||
u16 reserved[5];
|
|
||||||
struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
|
|
||||||
}__attribute__((packed, aligned (16)));
|
|
||||||
|
|
||||||
struct ipr_ioarcb_add_data {
|
struct ipr_ioarcb_add_data {
|
||||||
union {
|
union {
|
||||||
struct ipr_ioarcb_ata_regs regs;
|
|
||||||
struct ipr_ioadl_desc ioadl[5];
|
struct ipr_ioadl_desc ioadl[5];
|
||||||
__be32 add_cmd_parms[10];
|
__be32 add_cmd_parms[10];
|
||||||
} u;
|
} u;
|
||||||
|
@ -665,21 +630,6 @@ struct ipr_ioasa_gpdd {
|
||||||
__be32 ioa_data[2];
|
__be32 ioa_data[2];
|
||||||
}__attribute__((packed, aligned (4)));
|
}__attribute__((packed, aligned (4)));
|
||||||
|
|
||||||
struct ipr_ioasa_gata {
|
|
||||||
u8 error;
|
|
||||||
u8 nsect; /* Interrupt reason */
|
|
||||||
u8 lbal;
|
|
||||||
u8 lbam;
|
|
||||||
u8 lbah;
|
|
||||||
u8 device;
|
|
||||||
u8 status;
|
|
||||||
u8 alt_status; /* ATA CTL */
|
|
||||||
u8 hob_nsect;
|
|
||||||
u8 hob_lbal;
|
|
||||||
u8 hob_lbam;
|
|
||||||
u8 hob_lbah;
|
|
||||||
}__attribute__((packed, aligned (4)));
|
|
||||||
|
|
||||||
struct ipr_auto_sense {
|
struct ipr_auto_sense {
|
||||||
__be16 auto_sense_len;
|
__be16 auto_sense_len;
|
||||||
__be16 ioa_data_len;
|
__be16 ioa_data_len;
|
||||||
|
@ -713,7 +663,6 @@ struct ipr_ioasa_hdr {
|
||||||
__be32 ioasc_specific; /* status code specific field */
|
__be32 ioasc_specific; /* status code specific field */
|
||||||
#define IPR_ADDITIONAL_STATUS_FMT 0x80000000
|
#define IPR_ADDITIONAL_STATUS_FMT 0x80000000
|
||||||
#define IPR_AUTOSENSE_VALID 0x40000000
|
#define IPR_AUTOSENSE_VALID 0x40000000
|
||||||
#define IPR_ATA_DEVICE_WAS_RESET 0x20000000
|
|
||||||
#define IPR_IOASC_SPECIFIC_MASK 0x00ffffff
|
#define IPR_IOASC_SPECIFIC_MASK 0x00ffffff
|
||||||
#define IPR_FIELD_POINTER_VALID (0x80000000 >> 8)
|
#define IPR_FIELD_POINTER_VALID (0x80000000 >> 8)
|
||||||
#define IPR_FIELD_POINTER_MASK 0x0000ffff
|
#define IPR_FIELD_POINTER_MASK 0x0000ffff
|
||||||
|
@ -727,7 +676,6 @@ struct ipr_ioasa {
|
||||||
struct ipr_ioasa_vset vset;
|
struct ipr_ioasa_vset vset;
|
||||||
struct ipr_ioasa_af_dasd dasd;
|
struct ipr_ioasa_af_dasd dasd;
|
||||||
struct ipr_ioasa_gpdd gpdd;
|
struct ipr_ioasa_gpdd gpdd;
|
||||||
struct ipr_ioasa_gata gata;
|
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
struct ipr_auto_sense auto_sense;
|
struct ipr_auto_sense auto_sense;
|
||||||
|
@ -741,7 +689,6 @@ struct ipr_ioasa64 {
|
||||||
struct ipr_ioasa_vset vset;
|
struct ipr_ioasa_vset vset;
|
||||||
struct ipr_ioasa_af_dasd dasd;
|
struct ipr_ioasa_af_dasd dasd;
|
||||||
struct ipr_ioasa_gpdd gpdd;
|
struct ipr_ioasa_gpdd gpdd;
|
||||||
struct ipr_ioasa_gata gata;
|
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
struct ipr_auto_sense auto_sense;
|
struct ipr_auto_sense auto_sense;
|
||||||
|
@ -1279,13 +1226,6 @@ struct ipr_bus_attributes {
|
||||||
u32 max_xfer_rate;
|
u32 max_xfer_rate;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ipr_sata_port {
|
|
||||||
struct ipr_ioa_cfg *ioa_cfg;
|
|
||||||
struct ata_port *ap;
|
|
||||||
struct ipr_resource_entry *res;
|
|
||||||
struct ipr_ioasa_gata ioasa;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ipr_resource_entry {
|
struct ipr_resource_entry {
|
||||||
u8 needs_sync_complete:1;
|
u8 needs_sync_complete:1;
|
||||||
u8 in_erp:1;
|
u8 in_erp:1;
|
||||||
|
@ -1323,7 +1263,6 @@ struct ipr_resource_entry {
|
||||||
|
|
||||||
struct ipr_ioa_cfg *ioa_cfg;
|
struct ipr_ioa_cfg *ioa_cfg;
|
||||||
struct scsi_device *sdev;
|
struct scsi_device *sdev;
|
||||||
struct ipr_sata_port *sata_port;
|
|
||||||
struct list_head queue;
|
struct list_head queue;
|
||||||
}; /* struct ipr_resource_entry */
|
}; /* struct ipr_resource_entry */
|
||||||
|
|
||||||
|
@ -1582,7 +1521,6 @@ struct ipr_ioa_cfg {
|
||||||
struct ipr_cmnd *reset_cmd;
|
struct ipr_cmnd *reset_cmd;
|
||||||
int (*reset) (struct ipr_cmnd *);
|
int (*reset) (struct ipr_cmnd *);
|
||||||
|
|
||||||
struct ata_host ata_host;
|
|
||||||
char ipr_cmd_label[8];
|
char ipr_cmd_label[8];
|
||||||
#define IPR_CMD_LABEL "ipr_cmd"
|
#define IPR_CMD_LABEL "ipr_cmd"
|
||||||
u32 max_cmds;
|
u32 max_cmds;
|
||||||
|
@ -1604,7 +1542,6 @@ struct ipr_cmnd {
|
||||||
union {
|
union {
|
||||||
struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES];
|
struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES];
|
||||||
struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
|
struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES];
|
||||||
struct ipr_ata64_ioadl ata_ioadl;
|
|
||||||
} i;
|
} i;
|
||||||
union {
|
union {
|
||||||
struct ipr_ioasa ioasa;
|
struct ipr_ioasa ioasa;
|
||||||
|
@ -1612,7 +1549,6 @@ struct ipr_cmnd {
|
||||||
} s;
|
} s;
|
||||||
struct list_head queue;
|
struct list_head queue;
|
||||||
struct scsi_cmnd *scsi_cmd;
|
struct scsi_cmnd *scsi_cmd;
|
||||||
struct ata_queued_cmd *qc;
|
|
||||||
struct completion completion;
|
struct completion completion;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
|
|
|
@ -3362,8 +3362,9 @@ int pm8001_mpi_reg_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
|
||||||
pm8001_dev = ccb->device;
|
pm8001_dev = ccb->device;
|
||||||
status = le32_to_cpu(registerRespPayload->status);
|
status = le32_to_cpu(registerRespPayload->status);
|
||||||
device_id = le32_to_cpu(registerRespPayload->device_id);
|
device_id = le32_to_cpu(registerRespPayload->device_id);
|
||||||
pm8001_dbg(pm8001_ha, MSG, " register device is status = %d\n",
|
pm8001_dbg(pm8001_ha, INIT,
|
||||||
status);
|
"register device status %d phy_id 0x%x device_id %d\n",
|
||||||
|
status, pm8001_dev->attached_phy, device_id);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case DEVREG_SUCCESS:
|
case DEVREG_SUCCESS:
|
||||||
pm8001_dbg(pm8001_ha, MSG, "DEVREG_SUCCESS\n");
|
pm8001_dbg(pm8001_ha, MSG, "DEVREG_SUCCESS\n");
|
||||||
|
@ -4278,7 +4279,7 @@ int pm8001_chip_dereg_dev_req(struct pm8001_hba_info *pm8001_ha,
|
||||||
memset(&payload, 0, sizeof(payload));
|
memset(&payload, 0, sizeof(payload));
|
||||||
payload.tag = cpu_to_le32(1);
|
payload.tag = cpu_to_le32(1);
|
||||||
payload.device_id = cpu_to_le32(device_id);
|
payload.device_id = cpu_to_le32(device_id);
|
||||||
pm8001_dbg(pm8001_ha, MSG, "unregister device device_id = %d\n",
|
pm8001_dbg(pm8001_ha, INIT, "unregister device device_id %d\n",
|
||||||
device_id);
|
device_id);
|
||||||
|
|
||||||
return pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
|
return pm8001_mpi_build_cmd(pm8001_ha, 0, opc, &payload,
|
||||||
|
|
|
@ -2450,6 +2450,9 @@ static void __qedi_remove(struct pci_dev *pdev, int mode)
|
||||||
qedi_ops->ll2->stop(qedi->cdev);
|
qedi_ops->ll2->stop(qedi->cdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cancel_delayed_work_sync(&qedi->recovery_work);
|
||||||
|
cancel_delayed_work_sync(&qedi->board_disable_work);
|
||||||
|
|
||||||
qedi_free_iscsi_pf_param(qedi);
|
qedi_free_iscsi_pf_param(qedi);
|
||||||
|
|
||||||
rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
|
rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
|
||||||
|
|
|
@ -5291,6 +5291,26 @@ static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool scsi_debug_stop_all_queued_iter(struct request *rq, void *data)
|
||||||
|
{
|
||||||
|
struct scsi_device *sdp = data;
|
||||||
|
struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
|
||||||
|
|
||||||
|
if (scmd->device == sdp)
|
||||||
|
scsi_debug_abort_cmnd(scmd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deletes (stops) timers or work queues of all queued commands per sdev */
|
||||||
|
static void scsi_debug_stop_all_queued(struct scsi_device *sdp)
|
||||||
|
{
|
||||||
|
struct Scsi_Host *shost = sdp->host;
|
||||||
|
|
||||||
|
blk_mq_tagset_busy_iter(&shost->tag_set,
|
||||||
|
scsi_debug_stop_all_queued_iter, sdp);
|
||||||
|
}
|
||||||
|
|
||||||
static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
|
static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
|
||||||
{
|
{
|
||||||
struct scsi_device *sdp = SCpnt->device;
|
struct scsi_device *sdp = SCpnt->device;
|
||||||
|
@ -5300,6 +5320,8 @@ static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
|
||||||
|
|
||||||
if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
|
if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
|
||||||
sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
|
sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
|
||||||
|
|
||||||
|
scsi_debug_stop_all_queued(sdp);
|
||||||
if (devip)
|
if (devip)
|
||||||
set_bit(SDEBUG_UA_POR, devip->uas_bm);
|
set_bit(SDEBUG_UA_POR, devip->uas_bm);
|
||||||
|
|
||||||
|
|
|
@ -299,11 +299,11 @@ EXPORT_SYMBOL_GPL(ufshcd_mcq_poll_cqe_nolock);
|
||||||
unsigned long ufshcd_mcq_poll_cqe_lock(struct ufs_hba *hba,
|
unsigned long ufshcd_mcq_poll_cqe_lock(struct ufs_hba *hba,
|
||||||
struct ufs_hw_queue *hwq)
|
struct ufs_hw_queue *hwq)
|
||||||
{
|
{
|
||||||
unsigned long completed_reqs;
|
unsigned long completed_reqs, flags;
|
||||||
|
|
||||||
spin_lock(&hwq->cq_lock);
|
spin_lock_irqsave(&hwq->cq_lock, flags);
|
||||||
completed_reqs = ufshcd_mcq_poll_cqe_nolock(hba, hwq);
|
completed_reqs = ufshcd_mcq_poll_cqe_nolock(hba, hwq);
|
||||||
spin_unlock(&hwq->cq_lock);
|
spin_unlock_irqrestore(&hwq->cq_lock, flags);
|
||||||
|
|
||||||
return completed_reqs;
|
return completed_reqs;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче