mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
Merge branch '7.3/scsi-fixes' into 7.4/scsi-staging
Pull in scsi-fixes to resolve a merge conflict in libiscsi.c. Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
commit
306158e878
|
|
@ -2018,12 +2018,17 @@ static int disk_revalidate_zone_resources(struct gendisk *disk,
|
|||
struct blk_revalidate_zone_args *args)
|
||||
{
|
||||
struct queue_limits *lim = &disk->queue->limits;
|
||||
unsigned long long nr_zones;
|
||||
unsigned int pool_size;
|
||||
int ret = 0;
|
||||
|
||||
args->disk = disk;
|
||||
args->nr_zones =
|
||||
DIV_ROUND_UP_ULL(get_capacity(disk), lim->chunk_sectors);
|
||||
nr_zones = DIV_ROUND_UP_ULL(get_capacity(disk), lim->chunk_sectors);
|
||||
if (nr_zones > UINT_MAX) {
|
||||
pr_warn("%s: Too many zones (%llu)\n", disk->disk_name, nr_zones);
|
||||
return -EINVAL;
|
||||
}
|
||||
args->nr_zones = nr_zones;
|
||||
|
||||
/* Cached zone conditions: 1 byte per zone */
|
||||
args->zones_cond = kzalloc(args->nr_zones, GFP_NOIO);
|
||||
|
|
@ -2131,6 +2136,12 @@ static int blk_revalidate_zone_cond(struct blk_zone *zone, unsigned int idx,
|
|||
{
|
||||
enum blk_zone_cond cond = zone->cond;
|
||||
|
||||
if (idx >= args->nr_zones) {
|
||||
pr_warn("%s: Zone report index %u exceeds zone count %u\n",
|
||||
args->disk->disk_name, idx, args->nr_zones);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Check that the zone condition is consistent with the zone type. */
|
||||
switch (cond) {
|
||||
case BLK_ZONE_COND_NOT_WP:
|
||||
|
|
|
|||
|
|
@ -23,11 +23,14 @@ struct bsg_set {
|
|||
struct bsg_device *bd;
|
||||
bsg_job_fn *job_fn;
|
||||
bsg_timeout_fn *timeout_fn;
|
||||
unsigned int reply_len;
|
||||
};
|
||||
|
||||
static int bsg_transport_sg_io_fn(struct request_queue *q, struct sg_io_v4 *hdr,
|
||||
bool open_for_write, unsigned int timeout)
|
||||
{
|
||||
struct bsg_set *bset =
|
||||
container_of(q->tag_set, struct bsg_set, tag_set);
|
||||
struct bsg_job *job;
|
||||
struct request *rq;
|
||||
struct bio *bio;
|
||||
|
|
@ -50,7 +53,7 @@ static int bsg_transport_sg_io_fn(struct request_queue *q, struct sg_io_v4 *hdr,
|
|||
reply = job->reply;
|
||||
memset(job, 0, sizeof(*job));
|
||||
job->reply = reply;
|
||||
job->reply_len = SCSI_SENSE_BUFFERSIZE;
|
||||
job->reply_len = bset->reply_len;
|
||||
job->dd_data = job + 1;
|
||||
|
||||
job->request_len = hdr->request_len;
|
||||
|
|
@ -301,9 +304,10 @@ static blk_status_t bsg_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||
static int bsg_init_rq(struct blk_mq_tag_set *set, struct request *req,
|
||||
unsigned int hctx_idx, int numa_node)
|
||||
{
|
||||
struct bsg_set *bset = container_of(set, struct bsg_set, tag_set);
|
||||
struct bsg_job *job = blk_mq_rq_to_pdu(req);
|
||||
|
||||
job->reply = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_KERNEL);
|
||||
job->reply = kzalloc(bset->reply_len, GFP_KERNEL);
|
||||
if (!job->reply)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
|
@ -358,10 +362,12 @@ static const struct blk_mq_ops bsg_mq_ops = {
|
|||
* @job_fn: bsg job handler
|
||||
* @timeout: timeout handler function pointer
|
||||
* @dd_job_size: size of LLD data needed for each job
|
||||
* @reply_len: size of the reply buffer needed for each job
|
||||
*/
|
||||
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
||||
struct queue_limits *lim, bsg_job_fn *job_fn,
|
||||
bsg_timeout_fn *timeout, int dd_job_size)
|
||||
bsg_timeout_fn *timeout, int dd_job_size,
|
||||
unsigned int reply_len)
|
||||
{
|
||||
struct bsg_set *bset;
|
||||
struct blk_mq_tag_set *set;
|
||||
|
|
@ -374,6 +380,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
|||
|
||||
bset->job_fn = job_fn;
|
||||
bset->timeout_fn = timeout;
|
||||
bset->reply_len = reply_len;
|
||||
|
||||
set = &bset->tag_set;
|
||||
set->ops = &bsg_mq_ops;
|
||||
|
|
|
|||
|
|
@ -753,6 +753,7 @@ config SCSI_IBMVFC
|
|||
tristate "IBM Virtual FC support"
|
||||
depends on PPC_PSERIES && SCSI
|
||||
depends on SCSI_FC_ATTRS
|
||||
depends on NVME_FC || NVME_FC=n
|
||||
help
|
||||
This is the IBM POWER Virtual FC Client
|
||||
|
||||
|
|
|
|||
|
|
@ -112,7 +112,6 @@ typedef struct {
|
|||
int minor;
|
||||
char name[8];
|
||||
struct scsi_device *device;
|
||||
struct scsi_device **dt; /* ptrs to data transfer elements */
|
||||
u_int firsts[CH_TYPES];
|
||||
u_int counts[CH_TYPES];
|
||||
u_int voltags;
|
||||
|
|
@ -354,15 +353,10 @@ ch_readconfig(scsi_changer *ch)
|
|||
vendor_labels[i]);
|
||||
}
|
||||
|
||||
/* look up the devices of the data transfer elements */
|
||||
ch->dt = kzalloc_objs(*ch->dt, ch->counts[CHET_DT]);
|
||||
|
||||
if (!ch->dt) {
|
||||
kfree(buffer);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* report the devices of the data transfer elements */
|
||||
for (elem = 0; elem < ch->counts[CHET_DT]; elem++) {
|
||||
struct scsi_device *sdev;
|
||||
|
||||
id = -1;
|
||||
lun = 0;
|
||||
if (elem < CH_DT_MAX && -1 != dt_id[elem]) {
|
||||
|
|
@ -378,10 +372,8 @@ ch_readconfig(scsi_changer *ch)
|
|||
VPRINTK(KERN_INFO, "dt 0x%x: ",elem+ch->firsts[CHET_DT]);
|
||||
if (data[6] & 0x80) {
|
||||
VPRINTK(KERN_CONT, "not this SCSI bus\n");
|
||||
ch->dt[elem] = NULL;
|
||||
} else if (0 == (data[6] & 0x30)) {
|
||||
VPRINTK(KERN_CONT, "ID/LUN unknown\n");
|
||||
ch->dt[elem] = NULL;
|
||||
} else {
|
||||
id = ch->device->id;
|
||||
lun = 0;
|
||||
|
|
@ -391,18 +383,16 @@ ch_readconfig(scsi_changer *ch)
|
|||
}
|
||||
if (-1 != id) {
|
||||
VPRINTK(KERN_CONT, "ID %i, LUN %i, ",id,lun);
|
||||
ch->dt[elem] =
|
||||
scsi_device_lookup(ch->device->host,
|
||||
ch->device->channel,
|
||||
id,lun);
|
||||
if (!ch->dt[elem]) {
|
||||
sdev = scsi_device_lookup(ch->device->host,
|
||||
ch->device->channel,
|
||||
id, lun);
|
||||
if (!sdev) {
|
||||
/* should not happen */
|
||||
VPRINTK(KERN_CONT, "Huh? device not found!\n");
|
||||
} else {
|
||||
VPRINTK(KERN_CONT, "name: %8.8s %16.16s %4.4s\n",
|
||||
ch->dt[elem]->vendor,
|
||||
ch->dt[elem]->model,
|
||||
ch->dt[elem]->rev);
|
||||
sdev->vendor, sdev->model, sdev->rev);
|
||||
scsi_device_put(sdev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -566,7 +556,6 @@ static void ch_destroy(struct kref *ref)
|
|||
scsi_changer *ch = container_of(ref, scsi_changer, ref);
|
||||
|
||||
ch->device = NULL;
|
||||
kfree(ch->dt);
|
||||
kfree(ch);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
#define DRV_NAME "fnic"
|
||||
#define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
|
||||
#define DRV_VERSION "1.9.0.0"
|
||||
#define DRV_VERSION "1.9.0.1"
|
||||
#define PFX DRV_NAME ": "
|
||||
#define DFX DRV_NAME "%d: "
|
||||
|
||||
|
|
|
|||
|
|
@ -245,7 +245,14 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
unsigned int m = ARRAY_SIZE(fnic->wq);
|
||||
unsigned int o = ARRAY_SIZE(fnic->hw_copy_wq);
|
||||
unsigned int min_irqs = n + m + 1 + 1; /*rq, raw wq, wq, err*/
|
||||
|
||||
/*
|
||||
* Make driver critical vectors unmanaged, or else it can get tied
|
||||
* to an offline CPU. This can happen when hyper-threading is off.
|
||||
*/
|
||||
struct irq_affinity affd = {
|
||||
.pre_vectors = n + m + 1, /* rq, raw wq, 1 ioq */
|
||||
.post_vectors = 1, /* err */
|
||||
};
|
||||
/*
|
||||
* We need n RQs, m WQs, o Copy WQs, n+m+o CQs, and n+m+o+1 INTRs
|
||||
* (last INTR is used for WQ/RQ errors and notification area)
|
||||
|
|
@ -263,8 +270,8 @@ int fnic_set_intr_mode_msix(struct fnic *fnic)
|
|||
int vec_count = 0;
|
||||
int vecs = fnic->rq_count + fnic->raw_wq_count + fnic->wq_copy_count + 1;
|
||||
|
||||
vec_count = pci_alloc_irq_vectors(fnic->pdev, min_irqs, vecs,
|
||||
PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
|
||||
vec_count = pci_alloc_irq_vectors_affinity(fnic->pdev, min_irqs,
|
||||
vecs, PCI_IRQ_MSIX|PCI_IRQ_AFFINITY, &affd);
|
||||
FNIC_ISR_DBG(KERN_INFO, fnic,
|
||||
"allocated %d MSI-X vectors\n",
|
||||
vec_count);
|
||||
|
|
|
|||
|
|
@ -744,8 +744,19 @@ static int fnic_nvme_drv_init(struct fnic *fnic)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void fnic_mq_init_queue_map(struct fnic *fnic,
|
||||
struct blk_mq_queue_map *qmap)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
qmap->mq_map[cpu] = 0;
|
||||
}
|
||||
|
||||
void fnic_mq_map_queues_cpus(struct Scsi_Host *host)
|
||||
{
|
||||
const struct cpumask *mask;
|
||||
unsigned int queue, cpu;
|
||||
struct fnic *fnic = *((struct fnic **) shost_priv(host));
|
||||
struct pci_dev *l_pdev = fnic->pdev;
|
||||
int intr_mode = fnic->config.intr_mode;
|
||||
|
|
@ -766,7 +777,35 @@ void fnic_mq_map_queues_cpus(struct Scsi_Host *host)
|
|||
return;
|
||||
}
|
||||
|
||||
blk_mq_map_hw_queues(qmap, &l_pdev->dev, FNIC_PCI_OFFSET);
|
||||
fnic_mq_init_queue_map(fnic, qmap);
|
||||
|
||||
/*
|
||||
* Setup CPU to Queue mapping for all managed MSI-X IRQs.
|
||||
* Q0 is driver critical and non-managed, hence start from Q1.
|
||||
*/
|
||||
for (queue = 1; queue < qmap->nr_queues; queue++) {
|
||||
int irq_num = pci_irq_vector(fnic->pdev,
|
||||
queue + FNIC_PCI_OFFSET);
|
||||
|
||||
if (irq_num < 0)
|
||||
continue;
|
||||
|
||||
mask = pci_irq_get_affinity(fnic->pdev,
|
||||
queue + FNIC_PCI_OFFSET);
|
||||
if (!mask) {
|
||||
shost_printk(KERN_ERR, host,
|
||||
"failed to get irq_affinity map for queue:%d\n", irq_num);
|
||||
continue;
|
||||
}
|
||||
FNIC_MAIN_DBG(KERN_INFO, fnic,
|
||||
"got irq_affinity map for %d:\n", irq_num);
|
||||
for_each_cpu(cpu, mask) {
|
||||
qmap->mq_map[cpu] = qmap->queue_offset + queue;
|
||||
FNIC_MAIN_DBG(KERN_INFO, fnic,
|
||||
"[Q%d] cpu:%d <=> irq:%d\n",
|
||||
queue, cpu, irq_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
|
|
|||
|
|
@ -547,7 +547,6 @@ struct leapraid_fw_evt_work {
|
|||
/**
|
||||
* struct leapraid_fw_evt_struct - Firmware event handling structure
|
||||
*
|
||||
* @fw_evt_name: Name of the firmware event.
|
||||
* @fw_evt_thread: Workqueue used for processing firmware events.
|
||||
* @fw_evt_lock: Spinlock protecting access to the firmware event list.
|
||||
* @fw_evt_list: Linked list of pending firmware events.
|
||||
|
|
@ -558,7 +557,6 @@ struct leapraid_fw_evt_work {
|
|||
*/
|
||||
struct leapraid_fw_evt_struct {
|
||||
u32 leapraid_evt_masks[4];
|
||||
char fw_evt_name[48];
|
||||
struct workqueue_struct *fw_evt_thread;
|
||||
spinlock_t fw_evt_lock; /* protects firmware event */
|
||||
struct list_head fw_evt_list;
|
||||
|
|
|
|||
|
|
@ -2053,12 +2053,10 @@ static int leapraid_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
shost->transportt = leapraid_transport_template;
|
||||
shost->unique_id = adapter->adapter_attr.id;
|
||||
|
||||
snprintf(adapter->fw_evt_s.fw_evt_name,
|
||||
sizeof(adapter->fw_evt_s.fw_evt_name),
|
||||
"fw_event_%s%d", LEAPRAID_DRIVER_NAME,
|
||||
adapter->adapter_attr.id);
|
||||
adapter->fw_evt_s.fw_evt_thread =
|
||||
alloc_ordered_workqueue(adapter->fw_evt_s.fw_evt_name, 0);
|
||||
alloc_ordered_workqueue("fw_event_%s%d", 0,
|
||||
LEAPRAID_DRIVER_NAME,
|
||||
adapter->adapter_attr.id);
|
||||
if (!adapter->fw_evt_s.fw_evt_thread) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"%s: Failed to create fw event workqueue\n", __func__);
|
||||
|
|
|
|||
|
|
@ -1166,14 +1166,16 @@ static int iscsi_handle_reject(struct iscsi_session *session,
|
|||
spin_unlock(&session->frwd_lock);
|
||||
spin_lock(&session->back_lock);
|
||||
} else {
|
||||
struct iscsi_task *task;
|
||||
struct iscsi_task *task = NULL;
|
||||
/*
|
||||
* Our nop as ping got dropped. We know the target
|
||||
* and transport are ok so just clean up
|
||||
*/
|
||||
task = iscsi_itt_to_task(session, conn,
|
||||
rejected_pdu.itt);
|
||||
if (!task) {
|
||||
if (!iscsi_verify_itt(conn, rejected_pdu.itt))
|
||||
task = iscsi_itt_to_task(session, conn,
|
||||
rejected_pdu.itt);
|
||||
if (!task || task->state == ISCSI_TASK_FREE ||
|
||||
task->sc) {
|
||||
iscsi_conn_printk(KERN_ERR, conn,
|
||||
"Invalid pdu reject. Could "
|
||||
"not lookup rejected task.\n");
|
||||
|
|
@ -1218,7 +1220,7 @@ struct iscsi_task *iscsi_itt_to_task(struct iscsi_session *session,
|
|||
session->tt->parse_pdu_itt(conn, itt, &i, NULL);
|
||||
else
|
||||
i = get_itt(itt);
|
||||
if (i >= session->cmds_max)
|
||||
if (i < 0 || i >= session->cmds_max)
|
||||
return NULL;
|
||||
|
||||
return session->cmds[i];
|
||||
|
|
@ -1312,7 +1314,7 @@ int __iscsi_complete_pdu(struct iscsi_session *session, struct iscsi_conn *conn,
|
|||
case ISCSI_OP_SCSI_TMFUNC_RSP:
|
||||
case ISCSI_OP_NOOP_IN:
|
||||
task = iscsi_itt_to_task(session, conn, hdr->itt);
|
||||
if (!task)
|
||||
if (!task || task->state == ISCSI_TASK_FREE || task->sc)
|
||||
return ISCSI_ERR_BAD_ITT;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -1413,7 +1415,7 @@ int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt)
|
|||
return ISCSI_ERR_BAD_ITT;
|
||||
}
|
||||
|
||||
if (i >= session->cmds_max) {
|
||||
if (i < 0 || i >= session->cmds_max) {
|
||||
iscsi_conn_printk(KERN_ERR, conn,
|
||||
"received invalid itt index %u (max cmds "
|
||||
"%u.\n", i, session->cmds_max);
|
||||
|
|
|
|||
|
|
@ -480,6 +480,9 @@ static int iscsi_tcp_data_in(struct iscsi_conn *conn, struct iscsi_task *task)
|
|||
int datasn = be32_to_cpu(rhdr->datasn);
|
||||
unsigned total_in_length = task->sc->sdb.length;
|
||||
|
||||
if (task->sc->sc_data_direction != DMA_FROM_DEVICE)
|
||||
return ISCSI_ERR_PROTO;
|
||||
|
||||
/*
|
||||
* lib iscsi will update this in the completion handling if there
|
||||
* is status.
|
||||
|
|
|
|||
|
|
@ -62,7 +62,11 @@ static int smp_execute_task_sg(struct domain_device *dev,
|
|||
to_sas_internal(dev->port->ha->shost->transportt);
|
||||
struct sas_ha_struct *ha = dev->port->ha;
|
||||
|
||||
pm_runtime_get_sync(ha->dev);
|
||||
/*
|
||||
* Non-blocking: a sync resume here would deadlock against
|
||||
* sas_drain_work() during HA resume.
|
||||
*/
|
||||
pm_runtime_get_noresume(ha->dev);
|
||||
mutex_lock(&dev->ex_dev.cmd_mutex);
|
||||
for (retry = 0; retry < 3; retry++) {
|
||||
if (test_bit(SAS_DEV_GONE, &dev->state)) {
|
||||
|
|
@ -135,7 +139,7 @@ static int smp_execute_task_sg(struct domain_device *dev,
|
|||
}
|
||||
}
|
||||
mutex_unlock(&dev->ex_dev.cmd_mutex);
|
||||
pm_runtime_put_sync(ha->dev);
|
||||
pm_runtime_put(ha->dev);
|
||||
|
||||
BUG_ON(retry == 3 && task != NULL);
|
||||
sas_free_task(task);
|
||||
|
|
@ -2222,6 +2226,11 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
|
|||
goto out;
|
||||
}
|
||||
|
||||
/* The host may have autosuspended, resume it here. */
|
||||
ret = pm_runtime_resume_and_get(dev->port->ha->dev);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = smp_execute_task_sg(dev, job->request_payload.sg_list,
|
||||
job->reply_payload.sg_list);
|
||||
if (ret >= 0) {
|
||||
|
|
@ -2229,6 +2238,7 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
|
|||
rcvlen = job->reply_payload.payload_len - ret;
|
||||
ret = 0;
|
||||
}
|
||||
pm_runtime_put(dev->port->ha->dev);
|
||||
|
||||
out:
|
||||
bsg_job_done(job, ret, rcvlen);
|
||||
|
|
|
|||
|
|
@ -7886,7 +7886,9 @@ megasas_resume(struct device *dev)
|
|||
goto fail_init_mfi;
|
||||
}
|
||||
|
||||
if (megasas_get_ctrl_info(instance) != DCMD_SUCCESS)
|
||||
scoped_guard(mutex, &instance->reset_mutex)
|
||||
rval = megasas_get_ctrl_info(instance);
|
||||
if (rval != DCMD_SUCCESS)
|
||||
goto fail_init_mfi;
|
||||
|
||||
tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
|
||||
|
|
|
|||
|
|
@ -3082,7 +3082,7 @@ void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
|
|||
}
|
||||
|
||||
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), &lim,
|
||||
mpi3mr_bsg_request, NULL, 0);
|
||||
mpi3mr_bsg_request, NULL, 0, SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q)) {
|
||||
ioc_err(mrioc, "%s: bsg registration failed\n",
|
||||
dev_name(bsg_dev));
|
||||
|
|
|
|||
|
|
@ -58,15 +58,15 @@ MODULE_PARM_DESC(link_rate, "Enable link rate.\n"
|
|||
|
||||
bool pm8001_use_msix = true;
|
||||
module_param_named(use_msix, pm8001_use_msix, bool, 0444);
|
||||
MODULE_PARM_DESC(zoned, "Use MSIX interrupts. Default: true");
|
||||
MODULE_PARM_DESC(use_msix, "Use MSIX interrupts. Default: true");
|
||||
|
||||
static bool pm8001_use_tasklet = true;
|
||||
module_param_named(use_tasklet, pm8001_use_tasklet, bool, 0444);
|
||||
MODULE_PARM_DESC(zoned, "Use MSIX interrupts. Default: true");
|
||||
MODULE_PARM_DESC(use_tasklet, "Use tasklets for interrupt handling. Default: true");
|
||||
|
||||
static bool pm8001_read_wwn = true;
|
||||
module_param_named(read_wwn, pm8001_read_wwn, bool, 0444);
|
||||
MODULE_PARM_DESC(zoned, "Get WWN from the controller. Default: true");
|
||||
MODULE_PARM_DESC(read_wwn, "Get WWN from the controller. Default: true");
|
||||
|
||||
uint pcs_event_log_severity = 0x03;
|
||||
module_param(pcs_event_log_severity, int, 0644);
|
||||
|
|
|
|||
|
|
@ -2652,8 +2652,6 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
|
|||
snprintf(host_buf, sizeof(host_buf), "host_%d", qedi->shost->host_no);
|
||||
qedi_ops->common->set_name(qedi->cdev, host_buf);
|
||||
|
||||
qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.mtu = DEF_PATH_MTU + IPV6_HDR_LEN + TCP_HDR_LEN;
|
||||
qedi->ll2_mtu = DEF_PATH_MTU;
|
||||
|
|
@ -2670,6 +2668,7 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
|
|||
spin_lock_init(&qedi->task_idx_lock);
|
||||
mutex_init(&qedi->stats_lock);
|
||||
}
|
||||
qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
|
||||
qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
|
||||
qedi_ops->ll2->start(qedi->cdev, ¶ms);
|
||||
|
||||
|
|
|
|||
|
|
@ -352,7 +352,7 @@ MODULE_PARM_DESC(ql2xnvme_queues,
|
|||
|
||||
int ql2xfc2target = 1;
|
||||
module_param(ql2xfc2target, int, 0444);
|
||||
MODULE_PARM_DESC(qla2xfc2target,
|
||||
MODULE_PARM_DESC(ql2xfc2target,
|
||||
"Enables FC2 Target support. "
|
||||
"0 - FC2 Target support is disabled. "
|
||||
"1 - FC2 Target support is enabled (default).");
|
||||
|
|
|
|||
|
|
@ -728,6 +728,7 @@ int scsi_cdl_enable(struct scsi_device *sdev, bool enable)
|
|||
struct scsi_mode_data data;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
char *buf_data;
|
||||
size_t avail, offset;
|
||||
int len;
|
||||
|
||||
ret = scsi_mode_sense(sdev, 0x08, 0x0a, 0xf2, buf, sizeof(buf),
|
||||
|
|
@ -736,11 +737,24 @@ int scsi_cdl_enable(struct scsi_device *sdev, bool enable)
|
|||
return -EINVAL;
|
||||
|
||||
/* Enable or disable CDL using the ATA feature page */
|
||||
len = min_t(size_t, sizeof(buf),
|
||||
data.length - data.header_length -
|
||||
data.block_descriptor_length);
|
||||
buf_data = buf + data.header_length +
|
||||
data.block_descriptor_length;
|
||||
avail = min_t(size_t, data.length, sizeof(buf));
|
||||
if (data.header_length > avail)
|
||||
return -EINVAL;
|
||||
|
||||
offset = data.header_length;
|
||||
avail -= data.header_length;
|
||||
|
||||
if (data.block_descriptor_length > avail)
|
||||
return -EINVAL;
|
||||
|
||||
offset += data.block_descriptor_length;
|
||||
avail -= data.block_descriptor_length;
|
||||
|
||||
if (avail < 5)
|
||||
return -EINVAL;
|
||||
|
||||
buf_data = buf + offset;
|
||||
len = avail;
|
||||
|
||||
/*
|
||||
* If we want to enable CDL and CDL is already enabled on the
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ static struct {
|
|||
{"DGC", "DISK", NULL, BLIST_SPARSELUN}, /* EMC CLARiiON, no storage on LUN 0 */
|
||||
{"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
|
||||
{"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN |
|
||||
BLIST_REPORTLUN2 | BLIST_RETRY_ITF},
|
||||
BLIST_REPORTLUN2 | BLIST_RETRY_ITF | BLIST_SKIP_IO_HINTS},
|
||||
{"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN},
|
||||
{"easyRAID", "16P", NULL, BLIST_NOREPORTLUN},
|
||||
{"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN},
|
||||
|
|
|
|||
|
|
@ -4345,7 +4345,8 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
|
|||
scsi_init_limits(shost, &lim);
|
||||
lim.max_segments = min_not_zero(lim.max_segments, i->f->max_bsg_segments);
|
||||
q = bsg_setup_queue(dev, bsg_name, &lim, fc_bsg_dispatch,
|
||||
fc_bsg_job_timeout, i->f->dd_bsg_size);
|
||||
fc_bsg_job_timeout, i->f->dd_bsg_size,
|
||||
SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q)) {
|
||||
dev_err(dev,
|
||||
"fc_host%d: bsg interface failed to initialize - setup queue\n",
|
||||
|
|
@ -4378,7 +4379,8 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
|
|||
scsi_init_limits(shost, &lim);
|
||||
lim.max_segments = min_not_zero(lim.max_segments, i->f->max_bsg_segments);
|
||||
q = bsg_setup_queue(dev, dev_name(dev), &lim, fc_bsg_dispatch_prep,
|
||||
fc_bsg_job_timeout, i->f->dd_bsg_size);
|
||||
fc_bsg_job_timeout, i->f->dd_bsg_size,
|
||||
SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q)) {
|
||||
dev_err(dev, "failed to setup bsg queue\n");
|
||||
return PTR_ERR(q);
|
||||
|
|
|
|||
|
|
@ -1545,7 +1545,7 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
|
|||
snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
|
||||
scsi_init_limits(shost, &lim);
|
||||
q = bsg_setup_queue(dev, bsg_name, &lim, iscsi_bsg_host_dispatch, NULL,
|
||||
0);
|
||||
0, SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q)) {
|
||||
shost_printk(KERN_ERR, shost, "bsg interface failed to "
|
||||
"initialize - no request queue\n");
|
||||
|
|
|
|||
|
|
@ -199,7 +199,8 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
|||
|
||||
if (rphy) {
|
||||
q = bsg_setup_queue(&rphy->dev, dev_name(&rphy->dev), NULL,
|
||||
sas_smp_dispatch, NULL, 0);
|
||||
sas_smp_dispatch, NULL, 0,
|
||||
SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q))
|
||||
return PTR_ERR(q);
|
||||
rphy->q = q;
|
||||
|
|
@ -208,7 +209,8 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
|
|||
|
||||
snprintf(name, sizeof(name), "sas_host%d", shost->host_no);
|
||||
q = bsg_setup_queue(&shost->shost_gendev, name, NULL,
|
||||
sas_smp_dispatch, NULL, 0);
|
||||
sas_smp_dispatch, NULL, 0,
|
||||
SCSI_SENSE_BUFFERSIZE);
|
||||
if (IS_ERR(q))
|
||||
return PTR_ERR(q);
|
||||
to_sas_host_attrs(shost)->q = q;
|
||||
|
|
|
|||
|
|
@ -589,7 +589,7 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp)
|
|||
int sd_zbc_read_zones(struct scsi_disk *sdkp, struct queue_limits *lim,
|
||||
u8 buf[SD_BUF_SIZE])
|
||||
{
|
||||
unsigned int nr_zones;
|
||||
u64 nr_zones;
|
||||
u32 zone_blocks = 0;
|
||||
int ret;
|
||||
|
||||
|
|
@ -621,6 +621,12 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, struct queue_limits *lim,
|
|||
goto err;
|
||||
|
||||
nr_zones = round_up(sdkp->capacity, zone_blocks) >> ilog2(zone_blocks);
|
||||
if (nr_zones > INT_MAX) {
|
||||
sd_printk(KERN_ERR, sdkp, "Too many zones (%llu)\n",
|
||||
nr_zones);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
sdkp->early_zone_info.nr_zones = nr_zones;
|
||||
sdkp->early_zone_info.zone_blocks = zone_blocks;
|
||||
|
||||
|
|
|
|||
|
|
@ -3249,14 +3249,20 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
|
|||
partition >= ST_NBR_PARTITIONS)
|
||||
return (-EINVAL);
|
||||
if (partition != STp->partition) {
|
||||
if (get_location(STp, &blk, &p, 1))
|
||||
/*
|
||||
* Save the location for the partition the drive reports,
|
||||
* not for STp->partition: after a reset STp->partition may
|
||||
* not match the partition the drive is in.
|
||||
*/
|
||||
if (get_location(STp, &blk, &p, 1) ||
|
||||
p < 0 || p >= ST_NBR_PARTITIONS)
|
||||
STps->last_block_valid = 0;
|
||||
else {
|
||||
STps->last_block_valid = 1;
|
||||
STps->last_block_visited = blk;
|
||||
STp->ps[p].last_block_valid = 1;
|
||||
STp->ps[p].last_block_visited = blk;
|
||||
DEBC_printk(STp, "Visited block %d for "
|
||||
"partition %d saved.\n",
|
||||
blk, STp->partition);
|
||||
blk, p);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4604,11 +4610,11 @@ static void st_remove(struct scsi_device *SDp)
|
|||
remove_cdevs(tpnt);
|
||||
|
||||
mutex_lock(&st_ref_mutex);
|
||||
kref_put(&tpnt->kref, scsi_tape_release);
|
||||
mutex_unlock(&st_ref_mutex);
|
||||
spin_lock(&st_index_lock);
|
||||
idr_remove(&st_index_idr, index);
|
||||
spin_unlock(&st_index_lock);
|
||||
kref_put(&tpnt->kref, scsi_tape_release);
|
||||
mutex_unlock(&st_ref_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -367,6 +367,7 @@ static void scsifront_do_response(struct vscsifrnt_info *info,
|
|||
struct vscsifrnt_shadow *shadow;
|
||||
|
||||
if (ring_rsp->rqid >= VSCSIIF_MAX_REQS ||
|
||||
!info->shadow[ring_rsp->rqid] ||
|
||||
!info->shadow[ring_rsp->rqid]->inflight) {
|
||||
scsifront_set_error(info, "illegal rqid returned by backend!");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -1306,17 +1306,24 @@ static ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (iscsit_get_tpg(discovery_tpg) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
param = iscsi_find_param_from_key(AUTHMETHOD,
|
||||
discovery_tpg->param_list);
|
||||
if (!param)
|
||||
return -EINVAL;
|
||||
if (!param) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (op) {
|
||||
/*
|
||||
* Reset the AuthMethod key to CHAP.
|
||||
*/
|
||||
if (iscsi_update_param_value(param, CHAP) < 0)
|
||||
return -EINVAL;
|
||||
if (iscsi_update_param_value(param, CHAP) < 0) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
discovery_tpg->tpg_attrib.authentication = 1;
|
||||
iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 1;
|
||||
|
|
@ -1327,8 +1334,10 @@ static ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
|
|||
/*
|
||||
* Reset the AuthMethod key to CHAP,None
|
||||
*/
|
||||
if (iscsi_update_param_value(param, "CHAP,None") < 0)
|
||||
return -EINVAL;
|
||||
if (iscsi_update_param_value(param, "CHAP,None") < 0) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
discovery_tpg->tpg_attrib.authentication = 0;
|
||||
iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 0;
|
||||
|
|
@ -1337,7 +1346,10 @@ static ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item,
|
|||
" Discovery TPG\n");
|
||||
}
|
||||
|
||||
return count;
|
||||
err = count;
|
||||
out:
|
||||
iscsit_put_tpg(discovery_tpg);
|
||||
return err;
|
||||
}
|
||||
|
||||
CONFIGFS_ATTR(iscsi_disc_, enforce_discovery_auth);
|
||||
|
|
|
|||
|
|
@ -2359,7 +2359,7 @@ void target_do_delayed_work(struct work_struct *work)
|
|||
struct se_device *dev = container_of(work, struct se_device,
|
||||
delayed_cmd_work);
|
||||
|
||||
spin_lock(&dev->delayed_cmd_lock);
|
||||
spin_lock_irq(&dev->delayed_cmd_lock);
|
||||
while (!dev->ordered_sync_in_progress) {
|
||||
struct se_cmd *cmd;
|
||||
|
||||
|
|
@ -2380,12 +2380,12 @@ void target_do_delayed_work(struct work_struct *work)
|
|||
dev->ordered_sync_in_progress = true;
|
||||
|
||||
list_del(&cmd->se_delayed_node);
|
||||
spin_unlock(&dev->delayed_cmd_lock);
|
||||
spin_unlock_irq(&dev->delayed_cmd_lock);
|
||||
|
||||
__target_execute_cmd(cmd, true);
|
||||
spin_lock(&dev->delayed_cmd_lock);
|
||||
spin_lock_irq(&dev->delayed_cmd_lock);
|
||||
}
|
||||
spin_unlock(&dev->delayed_cmd_lock);
|
||||
spin_unlock_irq(&dev->delayed_cmd_lock);
|
||||
}
|
||||
|
||||
static void transport_complete_ordered_sync(struct se_cmd *cmd)
|
||||
|
|
|
|||
|
|
@ -312,20 +312,24 @@ static int ufshcd_mcq_get_tag(struct ufs_hba *hba, struct cq_entry *cqe)
|
|||
UFSHCD_NUM_RESERVED;
|
||||
}
|
||||
|
||||
static void ufshcd_mcq_compl_cqe(struct ufs_hba *hba, struct cq_entry *cqe)
|
||||
{
|
||||
int tag = ufshcd_mcq_get_tag(hba, cqe);
|
||||
|
||||
ufshcd_compl_one_cqe(hba, tag, cqe);
|
||||
/* After processing the CQE, mark it as an empty (invalid) entry. */
|
||||
cqe->command_desc_base_addr = 0;
|
||||
}
|
||||
|
||||
static void ufshcd_mcq_process_cqe(struct ufs_hba *hba,
|
||||
struct ufs_hw_queue *hwq)
|
||||
{
|
||||
struct cq_entry *cqe = ufshcd_mcq_cur_cqe(hwq);
|
||||
|
||||
if (cqe->command_desc_base_addr) {
|
||||
int tag = ufshcd_mcq_get_tag(hba, cqe);
|
||||
|
||||
ufshcd_compl_one_cqe(hba, tag, cqe);
|
||||
/* After processed the cqe, mark it empty (invalid) entry */
|
||||
cqe->command_desc_base_addr = 0;
|
||||
} else {
|
||||
if (cqe->command_desc_base_addr)
|
||||
ufshcd_mcq_compl_cqe(hba, cqe);
|
||||
else
|
||||
dev_err(hba->dev, "Abnormal CQ entry!\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -333,7 +337,7 @@ static void ufshcd_mcq_process_cqe(struct ufs_hba *hba,
|
|||
* controller disabled (HCE = 0). Reading host controller registers, e.g. the
|
||||
* CQ tail pointer (CQTPy), may not be safe with the host controller disabled.
|
||||
* Hence, iterate over all completion queue entries. This won't result in
|
||||
* double completions because ufshcd_mcq_process_cqe() clears a CQE after it
|
||||
* double completions because ufshcd_mcq_compl_cqe() clears a CQE after it
|
||||
* has been processed.
|
||||
*/
|
||||
void ufshcd_mcq_compl_all_cqes_lock(struct ufs_hba *hba,
|
||||
|
|
@ -344,13 +348,13 @@ void ufshcd_mcq_compl_all_cqes_lock(struct ufs_hba *hba,
|
|||
|
||||
spin_lock_irqsave(&hwq->cq_lock, flags);
|
||||
while (entries > 0) {
|
||||
ufshcd_mcq_process_cqe(hba, hwq);
|
||||
struct cq_entry *cqe = ufshcd_mcq_cur_cqe(hwq);
|
||||
|
||||
if (cqe->command_desc_base_addr)
|
||||
ufshcd_mcq_compl_cqe(hba, cqe);
|
||||
ufshcd_mcq_inc_cq_head_slot(hwq);
|
||||
entries--;
|
||||
}
|
||||
|
||||
ufshcd_mcq_update_cq_tail_slot(hwq);
|
||||
hwq->cq_head_slot = hwq->cq_tail_slot;
|
||||
spin_unlock_irqrestore(&hwq->cq_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -258,7 +258,7 @@ int ufs_bsg_probe(struct ufs_hba *hba)
|
|||
goto out;
|
||||
|
||||
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), NULL, ufs_bsg_request,
|
||||
NULL, 0);
|
||||
NULL, 0, sizeof(struct ufs_rpmb_reply));
|
||||
if (IS_ERR(q)) {
|
||||
ret = PTR_ERR(q);
|
||||
device_del(bsg_dev);
|
||||
|
|
|
|||
|
|
@ -6099,8 +6099,6 @@ static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
|
|||
if (blk_mq_is_reserved_rq(rq) || !hwq)
|
||||
return true;
|
||||
|
||||
ufshcd_mcq_compl_all_cqes_lock(hba, hwq);
|
||||
|
||||
/*
|
||||
* For those cmds of which the cqes are not present in the cq, complete
|
||||
* them explicitly.
|
||||
|
|
@ -6116,19 +6114,6 @@ static bool ufshcd_mcq_force_compl_one(struct request *rq, void *priv)
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool ufshcd_mcq_compl_one(struct request *rq, void *priv)
|
||||
{
|
||||
struct scsi_device *sdev = rq->q->queuedata;
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
struct ufs_hba *hba = shost_priv(shost);
|
||||
struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
|
||||
|
||||
if (!blk_mq_is_reserved_rq(rq) && hwq)
|
||||
ufshcd_mcq_poll_cqe_lock(hba, hwq);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* ufshcd_mcq_compl_pending_transfer - MCQ mode function. It is
|
||||
* invoked from the error handler context or ufshcd_host_reset_and_restore()
|
||||
|
|
@ -6143,10 +6128,18 @@ static bool ufshcd_mcq_compl_one(struct request *rq, void *priv)
|
|||
static void ufshcd_mcq_compl_pending_transfer(struct ufs_hba *hba,
|
||||
bool force_compl)
|
||||
{
|
||||
blk_mq_tagset_busy_iter(&hba->host->tag_set,
|
||||
force_compl ? ufshcd_mcq_force_compl_one :
|
||||
ufshcd_mcq_compl_one,
|
||||
NULL);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < hba->nr_hw_queues; i++) {
|
||||
if (force_compl)
|
||||
ufshcd_mcq_compl_all_cqes_lock(hba, &hba->uhq[i]);
|
||||
else
|
||||
ufshcd_mcq_poll_cqe_lock(hba, &hba->uhq[i]);
|
||||
}
|
||||
|
||||
if (force_compl)
|
||||
blk_mq_tagset_busy_iter(&hba->host->tag_set,
|
||||
ufshcd_mcq_force_compl_one, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -6872,11 +6865,17 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
|
|||
}
|
||||
/* Wait for ongoing ufshcd_queuecommand() calls to finish. */
|
||||
blk_mq_quiesce_tagset(&hba->host->tag_set);
|
||||
/*
|
||||
* Internal commands are submitted on the pseudo SCSI device. Let them
|
||||
* through so that the error handler can recover the link.
|
||||
*/
|
||||
blk_mq_unquiesce_queue(hba->host->pseudo_sdev->request_queue);
|
||||
cancel_work_sync(&hba->eeh_work);
|
||||
}
|
||||
|
||||
static void ufshcd_err_handling_unprepare(struct ufs_hba *hba)
|
||||
{
|
||||
blk_mq_quiesce_queue_nowait(hba->host->pseudo_sdev->request_queue);
|
||||
blk_mq_unquiesce_tagset(&hba->host->tag_set);
|
||||
ufshcd_release(hba);
|
||||
if (ufshcd_is_clkscaling_supported(hba))
|
||||
|
|
@ -9609,6 +9608,7 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie)
|
|||
ret = ufshcd_add_lus(hba);
|
||||
|
||||
out:
|
||||
ufshcd_release(hba);
|
||||
pm_runtime_put_sync(hba->dev);
|
||||
|
||||
if (ret)
|
||||
|
|
@ -11334,6 +11334,9 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
|
||||
ufshcd_init_clk_gating(hba);
|
||||
|
||||
/* Released by ufshcd_async_scan(), or by out_release on failure. */
|
||||
ufshcd_hold(hba);
|
||||
|
||||
ufshcd_init_clk_scaling(hba);
|
||||
|
||||
/*
|
||||
|
|
@ -11354,7 +11357,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
err = devm_request_irq(dev, irq, ufshcd_intr, IRQF_SHARED, UFSHCD, hba);
|
||||
if (err) {
|
||||
dev_err(hba->dev, "request irq failed\n");
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
} else {
|
||||
hba->is_irq_enabled = true;
|
||||
}
|
||||
|
|
@ -11370,7 +11373,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
dev_err(hba->dev, "Host controller enable failed\n");
|
||||
ufshcd_print_evt_hist(hba);
|
||||
ufshcd_print_host_state(hba);
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
}
|
||||
|
||||
INIT_DELAYED_WORK(&hba->rpm_dev_flush_recheck_work, ufshcd_rpm_dev_flush_recheck_work);
|
||||
|
|
@ -11384,7 +11387,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
|
||||
err = ufshcd_add_scsi_host(hba);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
/* Hold auto suspend until async scan completes */
|
||||
pm_runtime_get_sync(dev);
|
||||
|
|
@ -11404,7 +11407,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
|
||||
err = ufshcd_link_startup(hba);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
if (hba->mcq_enabled)
|
||||
ufshcd_config_mcq(hba);
|
||||
|
|
@ -11421,23 +11424,23 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
/* Verify device initialization by sending NOP OUT UPIU */
|
||||
err = ufshcd_verify_dev_init(hba);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
/* Initiate UFS initialization, and waiting until completion */
|
||||
err = ufshcd_complete_dev_init(hba);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
err = ufshcd_device_params_init(hba);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
err = ufshcd_post_device_init(hba);
|
||||
|
||||
initialized:
|
||||
ufshcd_process_probe_result(hba, probe_start, err);
|
||||
if (err)
|
||||
goto out_disable;
|
||||
goto out_release;
|
||||
|
||||
ufs_sysfs_add_nodes(hba->dev);
|
||||
hba->dme_qos_sysfs_handle = sysfs_get_dirent(hba->dev->kobj.sd,
|
||||
|
|
@ -11448,6 +11451,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
ufshcd_pm_qos_init(hba);
|
||||
return 0;
|
||||
|
||||
out_release:
|
||||
ufshcd_release(hba);
|
||||
out_disable:
|
||||
hba->is_irq_enabled = false;
|
||||
ufshcd_hba_exit(hba);
|
||||
|
|
|
|||
|
|
@ -509,6 +509,7 @@ static int ufs_mtk_mphy_power_on(struct ufs_hba *hba, bool on)
|
|||
struct ufs_mtk_host *host = ufshcd_get_variant(hba);
|
||||
struct phy *mphy = host->mphy;
|
||||
struct arm_smccc_res res;
|
||||
int err;
|
||||
int ret = 0;
|
||||
|
||||
if (!mphy || !(on ^ host->mphy_powered_on))
|
||||
|
|
@ -523,7 +524,18 @@ static int ufs_mtk_mphy_power_on(struct ufs_hba *hba, bool on)
|
|||
usleep_range(200, 210);
|
||||
ufs_mtk_va09_pwr_ctrl(res, 1);
|
||||
}
|
||||
phy_power_on(mphy);
|
||||
ret = phy_power_on(mphy);
|
||||
if (ret) {
|
||||
if (ufs_mtk_is_va09_supported(hba)) {
|
||||
ufs_mtk_va09_pwr_ctrl(res, 0);
|
||||
err = regulator_disable(host->reg_va09);
|
||||
if (err)
|
||||
dev_err(hba->dev,
|
||||
"failed to unwind va09: %d\n", err);
|
||||
}
|
||||
dev_err(hba->dev, "failed to enable mphy: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
phy_power_off(mphy);
|
||||
if (ufs_mtk_is_va09_supported(hba)) {
|
||||
|
|
@ -1295,7 +1307,9 @@ static int ufs_mtk_init(struct ufs_hba *hba)
|
|||
*
|
||||
* Enable phy clocks specifically here.
|
||||
*/
|
||||
ufs_mtk_mphy_power_on(hba, true);
|
||||
err = ufs_mtk_mphy_power_on(hba, true);
|
||||
if (err)
|
||||
goto out_variant_clear;
|
||||
|
||||
if (ufs_mtk_is_rtff_mtcmos(hba)) {
|
||||
/* First Restore here, to avoid backup unexpected value */
|
||||
|
|
|
|||
|
|
@ -206,7 +206,11 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba)
|
|||
dev_dbg(hba->dev,
|
||||
"%s: failed to read lanes-per-direction, ret=%d\n",
|
||||
__func__, ret);
|
||||
hba->lanes_per_direction = UFSHCD_DEFAULT_LANES_PER_DIRECTION;
|
||||
/* Old R-Car S4 DTBs lack "lanes-per-direction = <1>" */
|
||||
if (of_device_is_compatible(dev->of_node, "renesas,r8a779f0-ufs"))
|
||||
hba->lanes_per_direction = 1;
|
||||
else
|
||||
hba->lanes_per_direction = UFSHCD_DEFAULT_LANES_PER_DIRECTION;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,8 @@ void bsg_job_done(struct bsg_job *job, int result,
|
|||
unsigned int reply_payload_rcv_len);
|
||||
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
|
||||
struct queue_limits *lim, bsg_job_fn *job_fn,
|
||||
bsg_timeout_fn *timeout, int dd_job_size);
|
||||
bsg_timeout_fn *timeout, int dd_job_size,
|
||||
unsigned int reply_len);
|
||||
void bsg_remove_queue(struct request_queue *q);
|
||||
void bsg_job_put(struct bsg_job *job);
|
||||
int __must_check bsg_job_get(struct bsg_job *job);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user