Linux 5.12-rc6
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmBqLHgeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGQywH/jBaQjT79YA8pDIc D5x/fCOWPtUBy5lSmpmRcbUyPIXMXiCxPImOcqsRVyXJq4bpo6xQm3zvRUwCMCw1 d7LFA5+flTXNu/FevU3++LuwGIFdQJM/TTNrPDaXYgZ3XTmsN8Kkq36EYzvCnJN3 Y8RBEeF2UxTPK1O096uvft28zxATRzYscgXtSDzPN1zySjGw2bUu5IHuDOAdSg7/ szRHpYfJVMHkV+lJHIFeU9X4nyjqZIcEBzOZbkp7+B1yJsxjNDUxphMOcq7aQFkH 4evIZK+tldgoX+3pNWwoFRhJZoT5pfl4ajQOX1KLZ1bEFBJWxUb1iCQsBXjXdH1N 4viQZwY= =s5bn -----END PGP SIGNATURE----- Merge tag 'v5.12-rc6' into android-mainline Linux 5.12-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Id1efa76e6d993deeb30c8a53d1caa59fccea3fd5
This commit is contained in:
commit
2fca85226c
40 changed files with 256 additions and 196 deletions
|
|
@ -7474,8 +7474,9 @@ F: include/uapi/asm-generic/
|
|||
GENERIC PHY FRAMEWORK
|
||||
M: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
M: Vinod Koul <vkoul@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-phy@lists.infradead.org
|
||||
S: Supported
|
||||
Q: https://patchwork.kernel.org/project/linux-phy/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy.git
|
||||
F: Documentation/devicetree/bindings/phy/
|
||||
F: drivers/phy/
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 12
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Frozen Wasteland
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -887,7 +887,8 @@ static long pSeries_lpar_hpte_updatepp(unsigned long slot,
|
|||
|
||||
want_v = hpte_encode_avpn(vpn, psize, ssize);
|
||||
|
||||
flags = (newpp & 7) | H_AVPN;
|
||||
flags = (newpp & (HPTE_R_PP | HPTE_R_N | HPTE_R_KEY_LO)) | H_AVPN;
|
||||
flags |= (newpp & HPTE_R_KEY_HI) >> 48;
|
||||
if (mmu_has_feature(MMU_FTR_KERNEL_RO))
|
||||
/* Move pp0 into bit 8 (IBM 55) */
|
||||
flags |= (newpp & HPTE_R_PP0) >> 55;
|
||||
|
|
|
|||
|
|
@ -452,12 +452,28 @@ static int do_suspend(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct pseries_suspend_info - State shared between CPUs for join/suspend.
|
||||
* @counter: Threads are to increment this upon resuming from suspend
|
||||
* or if an error is received from H_JOIN. The thread which performs
|
||||
* the first increment (i.e. sets it to 1) is responsible for
|
||||
* waking the other threads.
|
||||
* @done: False if join/suspend is in progress. True if the operation is
|
||||
* complete (successful or not).
|
||||
*/
|
||||
struct pseries_suspend_info {
|
||||
atomic_t counter;
|
||||
bool done;
|
||||
};
|
||||
|
||||
static int do_join(void *arg)
|
||||
{
|
||||
atomic_t *counter = arg;
|
||||
struct pseries_suspend_info *info = arg;
|
||||
atomic_t *counter = &info->counter;
|
||||
long hvrc;
|
||||
int ret;
|
||||
|
||||
retry:
|
||||
/* Must ensure MSR.EE off for H_JOIN. */
|
||||
hard_irq_disable();
|
||||
hvrc = plpar_hcall_norets(H_JOIN);
|
||||
|
|
@ -473,8 +489,20 @@ static int do_join(void *arg)
|
|||
case H_SUCCESS:
|
||||
/*
|
||||
* The suspend is complete and this cpu has received a
|
||||
* prod.
|
||||
* prod, or we've received a stray prod from unrelated
|
||||
* code (e.g. paravirt spinlocks) and we need to join
|
||||
* again.
|
||||
*
|
||||
* This barrier orders the return from H_JOIN above vs
|
||||
* the load of info->done. It pairs with the barrier
|
||||
* in the wakeup/prod path below.
|
||||
*/
|
||||
smp_mb();
|
||||
if (READ_ONCE(info->done) == false) {
|
||||
pr_info_ratelimited("premature return from H_JOIN on CPU %i, retrying",
|
||||
smp_processor_id());
|
||||
goto retry;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
case H_BAD_MODE:
|
||||
|
|
@ -488,6 +516,13 @@ static int do_join(void *arg)
|
|||
|
||||
if (atomic_inc_return(counter) == 1) {
|
||||
pr_info("CPU %u waking all threads\n", smp_processor_id());
|
||||
WRITE_ONCE(info->done, true);
|
||||
/*
|
||||
* This barrier orders the store to info->done vs subsequent
|
||||
* H_PRODs to wake the other CPUs. It pairs with the barrier
|
||||
* in the H_SUCCESS case above.
|
||||
*/
|
||||
smp_mb();
|
||||
prod_others();
|
||||
}
|
||||
/*
|
||||
|
|
@ -535,11 +570,16 @@ static int pseries_suspend(u64 handle)
|
|||
int ret;
|
||||
|
||||
while (true) {
|
||||
atomic_t counter = ATOMIC_INIT(0);
|
||||
struct pseries_suspend_info info;
|
||||
unsigned long vasi_state;
|
||||
int vasi_err;
|
||||
|
||||
ret = stop_machine(do_join, &counter, cpu_online_mask);
|
||||
info = (struct pseries_suspend_info) {
|
||||
.counter = ATOMIC_INIT(0),
|
||||
.done = false,
|
||||
};
|
||||
|
||||
ret = stop_machine(do_join, &info, cpu_online_mask);
|
||||
if (ret == 0)
|
||||
break;
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -314,7 +314,7 @@ endchoice
|
|||
# Common NUMA Features
|
||||
config NUMA
|
||||
bool "NUMA Memory Allocation and Scheduler Support"
|
||||
depends on SMP
|
||||
depends on SMP && MMU
|
||||
select GENERIC_ARCH_NUMA
|
||||
select OF_NUMA
|
||||
select ARCH_SUPPORTS_NUMA_BALANCING
|
||||
|
|
|
|||
|
|
@ -306,7 +306,9 @@ do { \
|
|||
* data types like structures or arrays.
|
||||
*
|
||||
* @ptr must have pointer-to-simple-variable type, and @x must be assignable
|
||||
* to the result of dereferencing @ptr.
|
||||
* to the result of dereferencing @ptr. The value of @x is copied to avoid
|
||||
* re-ordering where @x is evaluated inside the block that enables user-space
|
||||
* access (thus bypassing user space protection if @x is a function).
|
||||
*
|
||||
* Caller must check the pointer with access_ok() before calling this
|
||||
* function.
|
||||
|
|
@ -316,12 +318,13 @@ do { \
|
|||
#define __put_user(x, ptr) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
|
||||
__typeof__(*__gu_ptr) __val = (x); \
|
||||
long __pu_err = 0; \
|
||||
\
|
||||
__chk_user_ptr(__gu_ptr); \
|
||||
\
|
||||
__enable_user_access(); \
|
||||
__put_user_nocheck(x, __gu_ptr, __pu_err); \
|
||||
__put_user_nocheck(__val, __gu_ptr, __pu_err); \
|
||||
__disable_user_access(); \
|
||||
\
|
||||
__pu_err; \
|
||||
|
|
|
|||
|
|
@ -447,6 +447,7 @@ ENDPROC(__switch_to)
|
|||
#endif
|
||||
|
||||
.section ".rodata"
|
||||
.align LGREG
|
||||
/* Exception vector table */
|
||||
ENTRY(excp_vect_table)
|
||||
RISCV_PTR do_trap_insn_misaligned
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
register const unsigned long sp_in_global __asm__("sp");
|
||||
register unsigned long sp_in_global __asm__("sp");
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ void __init kasan_init(void)
|
|||
break;
|
||||
|
||||
kasan_populate(kasan_mem_to_shadow(start), kasan_mem_to_shadow(end));
|
||||
};
|
||||
}
|
||||
|
||||
for (i = 0; i < PTRS_PER_PTE; i++)
|
||||
set_pte(&kasan_early_shadow_pte[i],
|
||||
|
|
|
|||
|
|
@ -97,6 +97,9 @@ static void deferred_probe_work_func(struct work_struct *work)
|
|||
|
||||
get_device(dev);
|
||||
|
||||
kfree(dev->p->deferred_probe_reason);
|
||||
dev->p->deferred_probe_reason = NULL;
|
||||
|
||||
/*
|
||||
* Drop the mutex while probing each device; the probe path may
|
||||
* manipulate the deferred list
|
||||
|
|
|
|||
|
|
@ -1241,6 +1241,7 @@ int extcon_dev_register(struct extcon_dev *edev)
|
|||
sizeof(*edev->nh), GFP_KERNEL);
|
||||
if (!edev->nh) {
|
||||
ret = -ENOMEM;
|
||||
device_unregister(&edev->dev);
|
||||
goto err_dev;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -346,6 +346,7 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
struct client *client = file->private_data;
|
||||
spinlock_t *client_list_lock = &client->lynx->client_list_lock;
|
||||
struct nosy_stats stats;
|
||||
int ret;
|
||||
|
||||
switch (cmd) {
|
||||
case NOSY_IOC_GET_STATS:
|
||||
|
|
@ -360,11 +361,15 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
return 0;
|
||||
|
||||
case NOSY_IOC_START:
|
||||
ret = -EBUSY;
|
||||
spin_lock_irq(client_list_lock);
|
||||
list_add_tail(&client->link, &client->lynx->client_list);
|
||||
if (list_empty(&client->link)) {
|
||||
list_add_tail(&client->link, &client->lynx->client_list);
|
||||
ret = 0;
|
||||
}
|
||||
spin_unlock_irq(client_list_lock);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
|
||||
case NOSY_IOC_STOP:
|
||||
spin_lock_irq(client_list_lock);
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ void icc_bulk_put(int num_paths, struct icc_bulk_data *paths)
|
|||
EXPORT_SYMBOL_GPL(icc_bulk_put);
|
||||
|
||||
/**
|
||||
* icc_bulk_set() - set bandwidth to a set of paths
|
||||
* icc_bulk_set_bw() - set bandwidth to a set of paths
|
||||
* @num_paths: the number of icc_bulk_data
|
||||
* @paths: the icc_bulk_data table containing the paths and bandwidth
|
||||
*
|
||||
|
|
|
|||
|
|
@ -942,6 +942,8 @@ int icc_link_destroy(struct icc_node *src, struct icc_node *dst)
|
|||
GFP_KERNEL);
|
||||
if (new)
|
||||
src->links = new;
|
||||
else
|
||||
ret = -ENOMEM;
|
||||
|
||||
out:
|
||||
mutex_unlock(&icc_lock);
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ DEFINE_QNODE(mas_pcnoc_sdcc_1, MSM8939_MASTER_SDCC_1, 8, -1, -1, MSM8939_PNOC_IN
|
|||
DEFINE_QNODE(mas_pcnoc_sdcc_2, MSM8939_MASTER_SDCC_2, 8, -1, -1, MSM8939_PNOC_INT_1);
|
||||
DEFINE_QNODE(mas_qdss_bam, MSM8939_MASTER_QDSS_BAM, 8, -1, -1, MSM8939_SNOC_QDSS_INT);
|
||||
DEFINE_QNODE(mas_qdss_etr, MSM8939_MASTER_QDSS_ETR, 8, -1, -1, MSM8939_SNOC_QDSS_INT);
|
||||
DEFINE_QNODE(mas_snoc_cfg, MSM8939_MASTER_SNOC_CFG, 4, 20, -1, MSM8939_SLAVE_SRVC_SNOC);
|
||||
DEFINE_QNODE(mas_snoc_cfg, MSM8939_MASTER_SNOC_CFG, 4, -1, -1, MSM8939_SLAVE_SRVC_SNOC);
|
||||
DEFINE_QNODE(mas_spdm, MSM8939_MASTER_SPDM, 4, -1, -1, MSM8939_PNOC_MAS_0);
|
||||
DEFINE_QNODE(mas_tcu0, MSM8939_MASTER_TCU0, 16, -1, -1, MSM8939_SLAVE_EBI_CH0, MSM8939_BIMC_SNOC_MAS, MSM8939_SLAVE_AMPSS_L2);
|
||||
DEFINE_QNODE(mas_usb_hs1, MSM8939_MASTER_USB_HS1, 4, -1, -1, MSM8939_PNOC_MAS_1);
|
||||
|
|
@ -156,14 +156,14 @@ DEFINE_QNODE(pcnoc_snoc_mas, MSM8939_PNOC_SNOC_MAS, 8, 29, -1, MSM8939_PNOC_SNOC
|
|||
DEFINE_QNODE(pcnoc_snoc_slv, MSM8939_PNOC_SNOC_SLV, 8, -1, 45, MSM8939_SNOC_INT_0, MSM8939_SNOC_INT_BIMC, MSM8939_SNOC_INT_1);
|
||||
DEFINE_QNODE(qdss_int, MSM8939_SNOC_QDSS_INT, 8, -1, -1, MSM8939_SNOC_INT_0, MSM8939_SNOC_INT_BIMC);
|
||||
DEFINE_QNODE(slv_apps_l2, MSM8939_SLAVE_AMPSS_L2, 16, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_apss, MSM8939_SLAVE_APSS, 4, -1, 20, 0);
|
||||
DEFINE_QNODE(slv_apss, MSM8939_SLAVE_APSS, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_audio, MSM8939_SLAVE_LPASS, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_bimc_cfg, MSM8939_SLAVE_BIMC_CFG, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_blsp_1, MSM8939_SLAVE_BLSP_1, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_boot_rom, MSM8939_SLAVE_BOOT_ROM, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_camera_cfg, MSM8939_SLAVE_CAMERA_CFG, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_cats_0, MSM8939_SLAVE_CATS_128, 16, -1, 106, 0);
|
||||
DEFINE_QNODE(slv_cats_1, MSM8939_SLAVE_OCMEM_64, 8, -1, 107, 0);
|
||||
DEFINE_QNODE(slv_cats_0, MSM8939_SLAVE_CATS_128, 16, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_cats_1, MSM8939_SLAVE_OCMEM_64, 8, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_clk_ctl, MSM8939_SLAVE_CLK_CTL, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_crypto_0_cfg, MSM8939_SLAVE_CRYPTO_0_CFG, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_dehr_cfg, MSM8939_SLAVE_DEHR_CFG, 4, -1, -1, 0);
|
||||
|
|
@ -187,20 +187,20 @@ DEFINE_QNODE(slv_sdcc_2, MSM8939_SLAVE_SDCC_2, 4, -1, -1, 0);
|
|||
DEFINE_QNODE(slv_security, MSM8939_SLAVE_SECURITY, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_snoc_cfg, MSM8939_SLAVE_SNOC_CFG, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_spdm, MSM8939_SLAVE_SPDM, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_srvc_snoc, MSM8939_SLAVE_SRVC_SNOC, 8, -1, 29, 0);
|
||||
DEFINE_QNODE(slv_srvc_snoc, MSM8939_SLAVE_SRVC_SNOC, 8, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_tcsr, MSM8939_SLAVE_TCSR, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_tlmm, MSM8939_SLAVE_TLMM, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_usb_hs1, MSM8939_SLAVE_USB_HS1, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_usb_hs2, MSM8939_SLAVE_USB_HS2, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(slv_venus_cfg, MSM8939_SLAVE_VENUS_CFG, 4, -1, -1, 0);
|
||||
DEFINE_QNODE(snoc_bimc_0_mas, MSM8939_SNOC_BIMC_0_MAS, 16, 3, -1, MSM8939_SNOC_BIMC_0_SLV);
|
||||
DEFINE_QNODE(snoc_bimc_0_slv, MSM8939_SNOC_BIMC_0_SLV, 16, -1, 24, MSM8939_SLAVE_EBI_CH0);
|
||||
DEFINE_QNODE(snoc_bimc_0_mas, MSM8939_SNOC_BIMC_0_MAS, 16, -1, -1, MSM8939_SNOC_BIMC_0_SLV);
|
||||
DEFINE_QNODE(snoc_bimc_0_slv, MSM8939_SNOC_BIMC_0_SLV, 16, -1, -1, MSM8939_SLAVE_EBI_CH0);
|
||||
DEFINE_QNODE(snoc_bimc_1_mas, MSM8939_SNOC_BIMC_1_MAS, 16, 76, -1, MSM8939_SNOC_BIMC_1_SLV);
|
||||
DEFINE_QNODE(snoc_bimc_1_slv, MSM8939_SNOC_BIMC_1_SLV, 16, -1, 104, MSM8939_SLAVE_EBI_CH0);
|
||||
DEFINE_QNODE(snoc_bimc_2_mas, MSM8939_SNOC_BIMC_2_MAS, 16, -1, -1, MSM8939_SNOC_BIMC_2_SLV);
|
||||
DEFINE_QNODE(snoc_bimc_2_slv, MSM8939_SNOC_BIMC_2_SLV, 16, -1, -1, MSM8939_SLAVE_EBI_CH0);
|
||||
DEFINE_QNODE(snoc_int_0, MSM8939_SNOC_INT_0, 8, 99, 130, MSM8939_SLAVE_QDSS_STM, MSM8939_SLAVE_IMEM, MSM8939_SNOC_PNOC_MAS);
|
||||
DEFINE_QNODE(snoc_int_1, MSM8939_SNOC_INT_1, 8, 100, 131, MSM8939_SLAVE_APSS, MSM8939_SLAVE_CATS_128, MSM8939_SLAVE_OCMEM_64);
|
||||
DEFINE_QNODE(snoc_int_1, MSM8939_SNOC_INT_1, 8, -1, -1, MSM8939_SLAVE_APSS, MSM8939_SLAVE_CATS_128, MSM8939_SLAVE_OCMEM_64);
|
||||
DEFINE_QNODE(snoc_int_bimc, MSM8939_SNOC_INT_BIMC, 8, 101, 132, MSM8939_SNOC_BIMC_1_MAS);
|
||||
DEFINE_QNODE(snoc_pcnoc_mas, MSM8939_SNOC_PNOC_MAS, 8, -1, -1, MSM8939_SNOC_PNOC_SLV);
|
||||
DEFINE_QNODE(snoc_pcnoc_slv, MSM8939_SNOC_PNOC_SLV, 8, -1, -1, MSM8939_PNOC_INT_0);
|
||||
|
|
|
|||
|
|
@ -2286,8 +2286,8 @@ int mei_cl_dma_alloc_and_map(struct mei_cl *cl, const struct file *fp,
|
|||
if (buffer_id == 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (!mei_cl_is_connected(cl))
|
||||
return -ENODEV;
|
||||
if (mei_cl_is_connected(cl))
|
||||
return -EPROTO;
|
||||
|
||||
if (cl->dma_mapped)
|
||||
return -EPROTO;
|
||||
|
|
@ -2327,9 +2327,7 @@ int mei_cl_dma_alloc_and_map(struct mei_cl *cl, const struct file *fp,
|
|||
|
||||
mutex_unlock(&dev->device_lock);
|
||||
wait_event_timeout(cl->wait,
|
||||
cl->dma_mapped ||
|
||||
cl->status ||
|
||||
!mei_cl_is_connected(cl),
|
||||
cl->dma_mapped || cl->status,
|
||||
mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
|
||||
mutex_lock(&dev->device_lock);
|
||||
|
||||
|
|
@ -2376,8 +2374,9 @@ int mei_cl_dma_unmap(struct mei_cl *cl, const struct file *fp)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!mei_cl_is_connected(cl))
|
||||
return -ENODEV;
|
||||
/* do not allow unmap for connected client */
|
||||
if (mei_cl_is_connected(cl))
|
||||
return -EPROTO;
|
||||
|
||||
if (!cl->dma_mapped)
|
||||
return -EPROTO;
|
||||
|
|
@ -2405,9 +2404,7 @@ int mei_cl_dma_unmap(struct mei_cl *cl, const struct file *fp)
|
|||
|
||||
mutex_unlock(&dev->device_lock);
|
||||
wait_event_timeout(cl->wait,
|
||||
!cl->dma_mapped ||
|
||||
cl->status ||
|
||||
!mei_cl_is_connected(cl),
|
||||
!cl->dma_mapped || cl->status,
|
||||
mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT));
|
||||
mutex_lock(&dev->device_lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -2475,6 +2475,7 @@ static void iscsi_if_stop_conn(struct iscsi_cls_conn *conn, int flag)
|
|||
*/
|
||||
mutex_lock(&conn_mutex);
|
||||
conn->transport->stop_conn(conn, flag);
|
||||
conn->state = ISCSI_CONN_DOWN;
|
||||
mutex_unlock(&conn_mutex);
|
||||
|
||||
}
|
||||
|
|
@ -2901,6 +2902,13 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
|
|||
default:
|
||||
err = transport->set_param(conn, ev->u.set_param.param,
|
||||
data, ev->u.set_param.len);
|
||||
if ((conn->state == ISCSI_CONN_BOUND) ||
|
||||
(conn->state == ISCSI_CONN_UP)) {
|
||||
err = transport->set_param(conn, ev->u.set_param.param,
|
||||
data, ev->u.set_param.len);
|
||||
} else {
|
||||
return -ENOTCONN;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
|
|
@ -2960,6 +2968,7 @@ static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
|
|||
mutex_lock(&conn->ep_mutex);
|
||||
conn->ep = NULL;
|
||||
mutex_unlock(&conn->ep_mutex);
|
||||
conn->state = ISCSI_CONN_DOWN;
|
||||
}
|
||||
|
||||
transport->ep_disconnect(ep);
|
||||
|
|
@ -3727,6 +3736,8 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
|
|||
ev->r.retcode = transport->bind_conn(session, conn,
|
||||
ev->u.b_conn.transport_eph,
|
||||
ev->u.b_conn.is_leading);
|
||||
if (!ev->r.retcode)
|
||||
conn->state = ISCSI_CONN_BOUND;
|
||||
mutex_unlock(&conn_mutex);
|
||||
|
||||
if (ev->r.retcode || !transport->ep_connect)
|
||||
|
|
@ -3966,7 +3977,8 @@ iscsi_conn_attr(local_ipaddr, ISCSI_PARAM_LOCAL_IPADDR);
|
|||
static const char *const connection_state_names[] = {
|
||||
[ISCSI_CONN_UP] = "up",
|
||||
[ISCSI_CONN_DOWN] = "down",
|
||||
[ISCSI_CONN_FAILED] = "failed"
|
||||
[ISCSI_CONN_FAILED] = "failed",
|
||||
[ISCSI_CONN_BOUND] = "bound"
|
||||
};
|
||||
|
||||
static ssize_t show_conn_state(struct device *dev,
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/printk.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/io.h>
|
||||
|
|
@ -92,14 +91,11 @@ struct geni_wrapper {
|
|||
struct device *dev;
|
||||
void __iomem *base;
|
||||
struct clk_bulk_data ahb_clks[NUM_AHB_CLKS];
|
||||
struct geni_icc_path to_core;
|
||||
};
|
||||
|
||||
static const char * const icc_path_names[] = {"qup-core", "qup-config",
|
||||
"qup-memory"};
|
||||
|
||||
static struct geni_wrapper *earlycon_wrapper;
|
||||
|
||||
#define QUP_HW_VER_REG 0x4
|
||||
|
||||
/* Common SE registers */
|
||||
|
|
@ -843,44 +839,11 @@ int geni_icc_disable(struct geni_se *se)
|
|||
}
|
||||
EXPORT_SYMBOL(geni_icc_disable);
|
||||
|
||||
void geni_remove_earlycon_icc_vote(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct geni_wrapper *wrapper;
|
||||
struct device_node *parent;
|
||||
struct device_node *child;
|
||||
|
||||
if (!earlycon_wrapper)
|
||||
return;
|
||||
|
||||
wrapper = earlycon_wrapper;
|
||||
parent = of_get_next_parent(wrapper->dev->of_node);
|
||||
for_each_child_of_node(parent, child) {
|
||||
if (!of_device_is_compatible(child, "qcom,geni-se-qup"))
|
||||
continue;
|
||||
|
||||
pdev = of_find_device_by_node(child);
|
||||
if (!pdev)
|
||||
continue;
|
||||
|
||||
wrapper = platform_get_drvdata(pdev);
|
||||
icc_put(wrapper->to_core.path);
|
||||
wrapper->to_core.path = NULL;
|
||||
|
||||
}
|
||||
of_node_put(parent);
|
||||
|
||||
earlycon_wrapper = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(geni_remove_earlycon_icc_vote);
|
||||
|
||||
static int geni_se_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
struct geni_wrapper *wrapper;
|
||||
struct console __maybe_unused *bcon;
|
||||
bool __maybe_unused has_earlycon = false;
|
||||
int ret;
|
||||
|
||||
wrapper = devm_kzalloc(dev, sizeof(*wrapper), GFP_KERNEL);
|
||||
|
|
@ -903,43 +866,6 @@ static int geni_se_probe(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_EARLYCON
|
||||
for_each_console(bcon) {
|
||||
if (!strcmp(bcon->name, "qcom_geni")) {
|
||||
has_earlycon = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!has_earlycon)
|
||||
goto exit;
|
||||
|
||||
wrapper->to_core.path = devm_of_icc_get(dev, "qup-core");
|
||||
if (IS_ERR(wrapper->to_core.path))
|
||||
return PTR_ERR(wrapper->to_core.path);
|
||||
/*
|
||||
* Put minmal BW request on core clocks on behalf of early console.
|
||||
* The vote will be removed earlycon exit function.
|
||||
*
|
||||
* Note: We are putting vote on each QUP wrapper instead only to which
|
||||
* earlycon is connected because QUP core clock of different wrapper
|
||||
* share same voltage domain. If core1 is put to 0, then core2 will
|
||||
* also run at 0, if not voted. Default ICC vote will be removed ASA
|
||||
* we touch any of the core clock.
|
||||
* core1 = core2 = max(core1, core2)
|
||||
*/
|
||||
ret = icc_set_bw(wrapper->to_core.path, GENI_DEFAULT_BW,
|
||||
GENI_DEFAULT_BW);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: ICC BW voting failed for core: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (of_get_compatible_child(pdev->dev.of_node, "qcom,geni-debug-uart"))
|
||||
earlycon_wrapper = wrapper;
|
||||
of_node_put(pdev->dev.of_node);
|
||||
exit:
|
||||
#endif
|
||||
dev_set_drvdata(dev, wrapper);
|
||||
dev_dbg(dev, "GENI SE Driver probed\n");
|
||||
return devm_of_platform_populate(dev);
|
||||
|
|
|
|||
|
|
@ -1105,7 +1105,7 @@ struct rtllib_network {
|
|||
bool bWithAironetIE;
|
||||
bool bCkipSupported;
|
||||
bool bCcxRmEnable;
|
||||
u16 CcxRmState[2];
|
||||
u8 CcxRmState[2];
|
||||
bool bMBssidValid;
|
||||
u8 MBssidMask;
|
||||
u8 MBssid[ETH_ALEN];
|
||||
|
|
|
|||
|
|
@ -1967,7 +1967,7 @@ static void rtllib_parse_mife_generic(struct rtllib_device *ieee,
|
|||
info_element->data[2] == 0x96 &&
|
||||
info_element->data[3] == 0x01) {
|
||||
if (info_element->len == 6) {
|
||||
memcpy(network->CcxRmState, &info_element[4], 2);
|
||||
memcpy(network->CcxRmState, &info_element->data[4], 2);
|
||||
if (network->CcxRmState[0] != 0)
|
||||
network->bCcxRmEnable = true;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1177,12 +1177,6 @@ static inline void qcom_geni_serial_enable_early_read(struct geni_se *se,
|
|||
struct console *con) { }
|
||||
#endif
|
||||
|
||||
static int qcom_geni_serial_earlycon_exit(struct console *con)
|
||||
{
|
||||
geni_remove_earlycon_icc_vote();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct qcom_geni_private_data earlycon_private_data;
|
||||
|
||||
static int __init qcom_geni_serial_earlycon_setup(struct earlycon_device *dev,
|
||||
|
|
@ -1233,7 +1227,6 @@ static int __init qcom_geni_serial_earlycon_setup(struct earlycon_device *dev,
|
|||
writel(stop_bit_len, uport->membase + SE_UART_TX_STOP_BIT_LEN);
|
||||
|
||||
dev->con->write = qcom_geni_serial_earlycon_write;
|
||||
dev->con->exit = qcom_geni_serial_earlycon_exit;
|
||||
dev->con->setup = NULL;
|
||||
qcom_geni_serial_enable_early_read(&se, dev->con);
|
||||
|
||||
|
|
|
|||
|
|
@ -147,17 +147,29 @@ static inline int acm_set_control(struct acm *acm, int control)
|
|||
#define acm_send_break(acm, ms) \
|
||||
acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0)
|
||||
|
||||
static void acm_kill_urbs(struct acm *acm)
|
||||
static void acm_poison_urbs(struct acm *acm)
|
||||
{
|
||||
int i;
|
||||
|
||||
usb_kill_urb(acm->ctrlurb);
|
||||
usb_poison_urb(acm->ctrlurb);
|
||||
for (i = 0; i < ACM_NW; i++)
|
||||
usb_kill_urb(acm->wb[i].urb);
|
||||
usb_poison_urb(acm->wb[i].urb);
|
||||
for (i = 0; i < acm->rx_buflimit; i++)
|
||||
usb_kill_urb(acm->read_urbs[i]);
|
||||
usb_poison_urb(acm->read_urbs[i]);
|
||||
}
|
||||
|
||||
static void acm_unpoison_urbs(struct acm *acm)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < acm->rx_buflimit; i++)
|
||||
usb_unpoison_urb(acm->read_urbs[i]);
|
||||
for (i = 0; i < ACM_NW; i++)
|
||||
usb_unpoison_urb(acm->wb[i].urb);
|
||||
usb_unpoison_urb(acm->ctrlurb);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Write buffer management.
|
||||
* All of these assume proper locks taken by the caller.
|
||||
|
|
@ -226,9 +238,10 @@ static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
|
|||
|
||||
rc = usb_submit_urb(wb->urb, GFP_ATOMIC);
|
||||
if (rc < 0) {
|
||||
dev_err(&acm->data->dev,
|
||||
"%s - usb_submit_urb(write bulk) failed: %d\n",
|
||||
__func__, rc);
|
||||
if (rc != -EPERM)
|
||||
dev_err(&acm->data->dev,
|
||||
"%s - usb_submit_urb(write bulk) failed: %d\n",
|
||||
__func__, rc);
|
||||
acm_write_done(acm, wb);
|
||||
}
|
||||
return rc;
|
||||
|
|
@ -313,8 +326,10 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)
|
|||
acm->iocount.dsr++;
|
||||
if (difference & ACM_CTRL_DCD)
|
||||
acm->iocount.dcd++;
|
||||
if (newctrl & ACM_CTRL_BRK)
|
||||
if (newctrl & ACM_CTRL_BRK) {
|
||||
acm->iocount.brk++;
|
||||
tty_insert_flip_char(&acm->port, 0, TTY_BREAK);
|
||||
}
|
||||
if (newctrl & ACM_CTRL_RI)
|
||||
acm->iocount.rng++;
|
||||
if (newctrl & ACM_CTRL_FRAMING)
|
||||
|
|
@ -480,11 +495,6 @@ static void acm_read_bulk_callback(struct urb *urb)
|
|||
dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n",
|
||||
rb->index, urb->actual_length, status);
|
||||
|
||||
if (!acm->dev) {
|
||||
dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case 0:
|
||||
usb_mark_last_busy(acm->dev);
|
||||
|
|
@ -649,7 +659,8 @@ static void acm_port_dtr_rts(struct tty_port *port, int raise)
|
|||
|
||||
res = acm_set_control(acm, val);
|
||||
if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE))
|
||||
dev_err(&acm->control->dev, "failed to set dtr/rts\n");
|
||||
/* This is broken in too many devices to spam the logs */
|
||||
dev_dbg(&acm->control->dev, "failed to set dtr/rts\n");
|
||||
}
|
||||
|
||||
static int acm_port_activate(struct tty_port *port, struct tty_struct *tty)
|
||||
|
|
@ -731,6 +742,7 @@ static void acm_port_shutdown(struct tty_port *port)
|
|||
* Need to grab write_lock to prevent race with resume, but no need to
|
||||
* hold it due to the tty-port initialised flag.
|
||||
*/
|
||||
acm_poison_urbs(acm);
|
||||
spin_lock_irq(&acm->write_lock);
|
||||
spin_unlock_irq(&acm->write_lock);
|
||||
|
||||
|
|
@ -747,7 +759,8 @@ static void acm_port_shutdown(struct tty_port *port)
|
|||
usb_autopm_put_interface_async(acm->control);
|
||||
}
|
||||
|
||||
acm_kill_urbs(acm);
|
||||
acm_unpoison_urbs(acm);
|
||||
|
||||
}
|
||||
|
||||
static void acm_tty_cleanup(struct tty_struct *tty)
|
||||
|
|
@ -1296,13 +1309,6 @@ skip_normal_probe:
|
|||
if (!combined_interfaces && intf != control_interface)
|
||||
return -ENODEV;
|
||||
|
||||
if (!combined_interfaces && usb_interface_claimed(data_interface)) {
|
||||
/* valid in this context */
|
||||
dev_dbg(&intf->dev, "The data interface isn't available\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
||||
if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 ||
|
||||
control_interface->cur_altsetting->desc.bNumEndpoints == 0)
|
||||
return -EINVAL;
|
||||
|
|
@ -1323,8 +1329,8 @@ made_compressed_probe:
|
|||
dev_dbg(&intf->dev, "interfaces are valid\n");
|
||||
|
||||
acm = kzalloc(sizeof(struct acm), GFP_KERNEL);
|
||||
if (acm == NULL)
|
||||
goto alloc_fail;
|
||||
if (!acm)
|
||||
return -ENOMEM;
|
||||
|
||||
tty_port_init(&acm->port);
|
||||
acm->port.ops = &acm_port_ops;
|
||||
|
|
@ -1341,7 +1347,7 @@ made_compressed_probe:
|
|||
|
||||
minor = acm_alloc_minor(acm);
|
||||
if (minor < 0)
|
||||
goto alloc_fail1;
|
||||
goto err_put_port;
|
||||
|
||||
acm->minor = minor;
|
||||
acm->dev = usb_dev;
|
||||
|
|
@ -1372,15 +1378,15 @@ made_compressed_probe:
|
|||
|
||||
buf = usb_alloc_coherent(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
|
||||
if (!buf)
|
||||
goto alloc_fail1;
|
||||
goto err_put_port;
|
||||
acm->ctrl_buffer = buf;
|
||||
|
||||
if (acm_write_buffers_alloc(acm) < 0)
|
||||
goto alloc_fail2;
|
||||
goto err_free_ctrl_buffer;
|
||||
|
||||
acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!acm->ctrlurb)
|
||||
goto alloc_fail3;
|
||||
goto err_free_write_buffers;
|
||||
|
||||
for (i = 0; i < num_rx_buf; i++) {
|
||||
struct acm_rb *rb = &(acm->read_buffers[i]);
|
||||
|
|
@ -1389,13 +1395,13 @@ made_compressed_probe:
|
|||
rb->base = usb_alloc_coherent(acm->dev, readsize, GFP_KERNEL,
|
||||
&rb->dma);
|
||||
if (!rb->base)
|
||||
goto alloc_fail4;
|
||||
goto err_free_read_urbs;
|
||||
rb->index = i;
|
||||
rb->instance = acm;
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!urb)
|
||||
goto alloc_fail4;
|
||||
goto err_free_read_urbs;
|
||||
|
||||
urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
urb->transfer_dma = rb->dma;
|
||||
|
|
@ -1416,8 +1422,8 @@ made_compressed_probe:
|
|||
struct acm_wb *snd = &(acm->wb[i]);
|
||||
|
||||
snd->urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (snd->urb == NULL)
|
||||
goto alloc_fail5;
|
||||
if (!snd->urb)
|
||||
goto err_free_write_urbs;
|
||||
|
||||
if (usb_endpoint_xfer_int(epwrite))
|
||||
usb_fill_int_urb(snd->urb, usb_dev, acm->out,
|
||||
|
|
@ -1435,7 +1441,7 @@ made_compressed_probe:
|
|||
|
||||
i = device_create_file(&intf->dev, &dev_attr_bmCapabilities);
|
||||
if (i < 0)
|
||||
goto alloc_fail5;
|
||||
goto err_free_write_urbs;
|
||||
|
||||
if (h.usb_cdc_country_functional_desc) { /* export the country data */
|
||||
struct usb_cdc_country_functional_desc * cfd =
|
||||
|
|
@ -1480,20 +1486,21 @@ skip_countries:
|
|||
acm->nb_index = 0;
|
||||
acm->nb_size = 0;
|
||||
|
||||
dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
|
||||
|
||||
acm->line.dwDTERate = cpu_to_le32(9600);
|
||||
acm->line.bDataBits = 8;
|
||||
acm_set_line(acm, &acm->line);
|
||||
|
||||
usb_driver_claim_interface(&acm_driver, data_interface, acm);
|
||||
usb_set_intfdata(data_interface, acm);
|
||||
if (!acm->combined_interfaces) {
|
||||
rv = usb_driver_claim_interface(&acm_driver, data_interface, acm);
|
||||
if (rv)
|
||||
goto err_remove_files;
|
||||
}
|
||||
|
||||
tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor,
|
||||
&control_interface->dev);
|
||||
if (IS_ERR(tty_dev)) {
|
||||
rv = PTR_ERR(tty_dev);
|
||||
goto alloc_fail6;
|
||||
goto err_release_data_interface;
|
||||
}
|
||||
|
||||
if (quirks & CLEAR_HALT_CONDITIONS) {
|
||||
|
|
@ -1501,32 +1508,39 @@ skip_countries:
|
|||
usb_clear_halt(usb_dev, acm->out);
|
||||
}
|
||||
|
||||
dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
|
||||
|
||||
return 0;
|
||||
alloc_fail6:
|
||||
|
||||
err_release_data_interface:
|
||||
if (!acm->combined_interfaces) {
|
||||
/* Clear driver data so that disconnect() returns early. */
|
||||
usb_set_intfdata(data_interface, NULL);
|
||||
usb_driver_release_interface(&acm_driver, data_interface);
|
||||
}
|
||||
err_remove_files:
|
||||
if (acm->country_codes) {
|
||||
device_remove_file(&acm->control->dev,
|
||||
&dev_attr_wCountryCodes);
|
||||
device_remove_file(&acm->control->dev,
|
||||
&dev_attr_iCountryCodeRelDate);
|
||||
kfree(acm->country_codes);
|
||||
}
|
||||
device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
|
||||
alloc_fail5:
|
||||
usb_set_intfdata(intf, NULL);
|
||||
err_free_write_urbs:
|
||||
for (i = 0; i < ACM_NW; i++)
|
||||
usb_free_urb(acm->wb[i].urb);
|
||||
alloc_fail4:
|
||||
err_free_read_urbs:
|
||||
for (i = 0; i < num_rx_buf; i++)
|
||||
usb_free_urb(acm->read_urbs[i]);
|
||||
acm_read_buffers_free(acm);
|
||||
usb_free_urb(acm->ctrlurb);
|
||||
alloc_fail3:
|
||||
err_free_write_buffers:
|
||||
acm_write_buffers_free(acm);
|
||||
alloc_fail2:
|
||||
err_free_ctrl_buffer:
|
||||
usb_free_coherent(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
|
||||
alloc_fail1:
|
||||
err_put_port:
|
||||
tty_port_put(&acm->port);
|
||||
alloc_fail:
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
@ -1540,8 +1554,14 @@ static void acm_disconnect(struct usb_interface *intf)
|
|||
if (!acm)
|
||||
return;
|
||||
|
||||
mutex_lock(&acm->mutex);
|
||||
acm->disconnected = true;
|
||||
/*
|
||||
* there is a circular dependency. acm_softint() can resubmit
|
||||
* the URBs in error handling so we need to block any
|
||||
* submission right away
|
||||
*/
|
||||
acm_poison_urbs(acm);
|
||||
mutex_lock(&acm->mutex);
|
||||
if (acm->country_codes) {
|
||||
device_remove_file(&acm->control->dev,
|
||||
&dev_attr_wCountryCodes);
|
||||
|
|
@ -1560,7 +1580,6 @@ static void acm_disconnect(struct usb_interface *intf)
|
|||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
acm_kill_urbs(acm);
|
||||
cancel_delayed_work_sync(&acm->dwork);
|
||||
|
||||
tty_unregister_device(acm_tty_driver, acm->minor);
|
||||
|
|
@ -1602,7 +1621,7 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message)
|
|||
if (cnt)
|
||||
return 0;
|
||||
|
||||
acm_kill_urbs(acm);
|
||||
acm_poison_urbs(acm);
|
||||
cancel_delayed_work_sync(&acm->dwork);
|
||||
acm->urbs_in_error_delay = 0;
|
||||
|
||||
|
|
@ -1615,6 +1634,7 @@ static int acm_resume(struct usb_interface *intf)
|
|||
struct urb *urb;
|
||||
int rv = 0;
|
||||
|
||||
acm_unpoison_urbs(acm);
|
||||
spin_lock_irq(&acm->write_lock);
|
||||
|
||||
if (--acm->susp_count)
|
||||
|
|
|
|||
|
|
@ -498,6 +498,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* DJI CineSSD */
|
||||
{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* Fibocom L850-GL LTE Modem */
|
||||
{ USB_DEVICE(0x2cb7, 0x0007), .driver_info =
|
||||
USB_QUIRK_IGNORE_REMOTE_WAKEUP },
|
||||
|
||||
/* INTEL VALUE SSD */
|
||||
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
|
|
|||
|
|
@ -4322,7 +4322,8 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
|
|||
if (hsotg->op_state == OTG_STATE_B_PERIPHERAL)
|
||||
goto unlock;
|
||||
|
||||
if (hsotg->params.power_down > DWC2_POWER_DOWN_PARAM_PARTIAL)
|
||||
if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL ||
|
||||
hsotg->flags.b.port_connect_status == 0)
|
||||
goto skip_power_saving;
|
||||
|
||||
/*
|
||||
|
|
@ -5398,7 +5399,7 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg)
|
|||
dwc2_writel(hsotg, hprt0, HPRT0);
|
||||
|
||||
/* Wait for the HPRT0.PrtSusp register field to be set */
|
||||
if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000))
|
||||
if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 5000))
|
||||
dev_warn(hsotg->dev, "Suspend wasn't generated\n");
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -120,6 +120,8 @@ static const struct property_entry dwc3_pci_intel_properties[] = {
|
|||
static const struct property_entry dwc3_pci_mrfld_properties[] = {
|
||||
PROPERTY_ENTRY_STRING("dr_mode", "otg"),
|
||||
PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
|
||||
PROPERTY_ENTRY_BOOL("snps,dis_u3_susphy_quirk"),
|
||||
PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
|
||||
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -244,6 +244,9 @@ static int dwc3_qcom_interconnect_init(struct dwc3_qcom *qcom)
|
|||
struct device *dev = qcom->dev;
|
||||
int ret;
|
||||
|
||||
if (has_acpi_companion(dev))
|
||||
return 0;
|
||||
|
||||
qcom->icc_path_ddr = of_icc_get(dev, "usb-ddr");
|
||||
if (IS_ERR(qcom->icc_path_ddr)) {
|
||||
dev_err(dev, "failed to get usb-ddr path: %ld\n",
|
||||
|
|
|
|||
|
|
@ -791,10 +791,6 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|||
reg &= ~DWC3_DALEPENA_EP(dep->number);
|
||||
dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
|
||||
|
||||
dep->stream_capable = false;
|
||||
dep->type = 0;
|
||||
dep->flags = 0;
|
||||
|
||||
/* Clear out the ep descriptors for non-ep0 */
|
||||
if (dep->number > 1) {
|
||||
dep->endpoint.comp_desc = NULL;
|
||||
|
|
@ -803,6 +799,10 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
|||
|
||||
dwc3_remove_requests(dwc, dep);
|
||||
|
||||
dep->stream_capable = false;
|
||||
dep->type = 0;
|
||||
dep->flags = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2083,7 +2083,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc)
|
|||
u32 reg;
|
||||
|
||||
speed = dwc->gadget_max_speed;
|
||||
if (speed > dwc->maximum_speed)
|
||||
if (speed == USB_SPEED_UNKNOWN || speed > dwc->maximum_speed)
|
||||
speed = dwc->maximum_speed;
|
||||
|
||||
if (speed == USB_SPEED_SUPER_PLUS &&
|
||||
|
|
@ -2523,6 +2523,7 @@ static void dwc3_gadget_set_ssp_rate(struct usb_gadget *g,
|
|||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
dwc->gadget_max_speed = USB_SPEED_SUPER_PLUS;
|
||||
dwc->gadget_ssp_rate = rate;
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,6 +153,11 @@ static int udc_pci_probe(
|
|||
pci_set_master(pdev);
|
||||
pci_try_set_mwi(pdev);
|
||||
|
||||
dev->phys_addr = resource;
|
||||
dev->irq = pdev->irq;
|
||||
dev->pdev = pdev;
|
||||
dev->dev = &pdev->dev;
|
||||
|
||||
/* init dma pools */
|
||||
if (use_dma) {
|
||||
retval = init_dma_pools(dev);
|
||||
|
|
@ -160,11 +165,6 @@ static int udc_pci_probe(
|
|||
goto err_dma;
|
||||
}
|
||||
|
||||
dev->phys_addr = resource;
|
||||
dev->irq = pdev->irq;
|
||||
dev->pdev = pdev;
|
||||
dev->dev = &pdev->dev;
|
||||
|
||||
/* general probing */
|
||||
if (udc_probe(dev)) {
|
||||
retval = -ENODEV;
|
||||
|
|
|
|||
|
|
@ -397,6 +397,13 @@ static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|||
xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
|
||||
if (mtk->lpm_support)
|
||||
xhci->quirks |= XHCI_LPM_SUPPORT;
|
||||
|
||||
/*
|
||||
* MTK xHCI 0.96: PSA is 1 by default even if doesn't support stream,
|
||||
* and it's 3 when support it.
|
||||
*/
|
||||
if (xhci->hci_version < 0x100 && HCC_MAX_PSA(xhci->hcc_params) == 4)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
}
|
||||
|
||||
/* called during probe() after chip reset completes */
|
||||
|
|
@ -548,7 +555,8 @@ static int xhci_mtk_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto put_usb3_hcd;
|
||||
|
||||
if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
|
||||
if (HCC_MAX_PSA(xhci->hcc_params) >= 4 &&
|
||||
!(xhci->quirks & XHCI_BROKEN_STREAMS))
|
||||
xhci->shared_hcd->can_do_streams = 1;
|
||||
|
||||
ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
|
||||
|
|
|
|||
|
|
@ -2004,10 +2004,14 @@ static void musb_pm_runtime_check_session(struct musb *musb)
|
|||
MUSB_DEVCTL_HR;
|
||||
switch (devctl & ~s) {
|
||||
case MUSB_QUIRK_B_DISCONNECT_99:
|
||||
musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
|
||||
schedule_delayed_work(&musb->irq_work,
|
||||
msecs_to_jiffies(1000));
|
||||
break;
|
||||
if (musb->quirk_retries && !musb->flush_irq_work) {
|
||||
musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n");
|
||||
schedule_delayed_work(&musb->irq_work,
|
||||
msecs_to_jiffies(1000));
|
||||
musb->quirk_retries--;
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
case MUSB_QUIRK_B_INVALID_VBUS_91:
|
||||
if (musb->quirk_retries && !musb->flush_irq_work) {
|
||||
musb_dbg(musb,
|
||||
|
|
|
|||
|
|
@ -594,6 +594,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|||
pr_err("invalid port number %d\n", wIndex);
|
||||
goto error;
|
||||
}
|
||||
if (wValue >= 32)
|
||||
goto error;
|
||||
if (hcd->speed == HCD_USB3) {
|
||||
if ((vhci_hcd->port_status[rhport] &
|
||||
USB_SS_PORT_STAT_POWER) != 0) {
|
||||
|
|
|
|||
|
|
@ -1333,6 +1333,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
|
|||
|
||||
ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
|
||||
|
||||
if (!ops->cursor)
|
||||
return;
|
||||
|
||||
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
|
||||
get_color(vc, info, c, 0));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1031,7 +1031,6 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
|
|||
PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
|
||||
if (!pdev) {
|
||||
pr_err("Unable to find PCI Hyper-V video\n");
|
||||
kfree(info->apertures);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -1129,7 +1128,6 @@ getmem_done:
|
|||
} else {
|
||||
pci_dev_put(pdev);
|
||||
}
|
||||
kfree(info->apertures);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -1141,7 +1139,6 @@ err2:
|
|||
err1:
|
||||
if (!gen2vm)
|
||||
pci_dev_put(pdev);
|
||||
kfree(info->apertures);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,8 +162,10 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
|
|||
int error;
|
||||
|
||||
error = init_threads(sdp);
|
||||
if (error)
|
||||
if (error) {
|
||||
gfs2_withdraw_delayed(sdp);
|
||||
return error;
|
||||
}
|
||||
|
||||
j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
|
||||
if (gfs2_withdrawn(sdp)) {
|
||||
|
|
@ -750,11 +752,13 @@ void gfs2_freeze_func(struct work_struct *work)
|
|||
static int gfs2_freeze(struct super_block *sb)
|
||||
{
|
||||
struct gfs2_sbd *sdp = sb->s_fs_info;
|
||||
int error = 0;
|
||||
int error;
|
||||
|
||||
mutex_lock(&sdp->sd_freeze_mutex);
|
||||
if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN)
|
||||
if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN) {
|
||||
error = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if (gfs2_withdrawn(sdp)) {
|
||||
|
|
@ -795,10 +799,10 @@ static int gfs2_unfreeze(struct super_block *sb)
|
|||
struct gfs2_sbd *sdp = sb->s_fs_info;
|
||||
|
||||
mutex_lock(&sdp->sd_freeze_mutex);
|
||||
if (atomic_read(&sdp->sd_freeze_state) != SFS_FROZEN ||
|
||||
if (atomic_read(&sdp->sd_freeze_state) != SFS_FROZEN ||
|
||||
!gfs2_holder_initialized(&sdp->sd_freeze_gh)) {
|
||||
mutex_unlock(&sdp->sd_freeze_mutex);
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
gfs2_freeze_unlock(&sdp->sd_freeze_gh);
|
||||
|
|
|
|||
|
|
@ -2479,6 +2479,11 @@ static bool io_rw_should_reissue(struct io_kiocb *req)
|
|||
return false;
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static bool io_rw_should_reissue(struct io_kiocb *req)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool io_rw_reissue(struct io_kiocb *req)
|
||||
|
|
|
|||
|
|
@ -271,6 +271,29 @@ static inline void devm_extcon_unregister_notifier(struct device *dev,
|
|||
struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb) { }
|
||||
|
||||
static inline int extcon_register_notifier_all(struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_unregister_notifier_all(struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int devm_extcon_register_notifier_all(struct device *dev,
|
||||
struct extcon_dev *edev,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void devm_extcon_unregister_notifier_all(struct device *dev,
|
||||
struct extcon_dev *edev,
|
||||
struct notifier_block *nb) { }
|
||||
|
||||
static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
* COMMAND_RECONFIG_FLAG_PARTIAL:
|
||||
* Set to FPGA configuration type (full or partial).
|
||||
*/
|
||||
#define COMMAND_RECONFIG_FLAG_PARTIAL 1
|
||||
#define COMMAND_RECONFIG_FLAG_PARTIAL 0
|
||||
|
||||
/*
|
||||
* Timeout settings for service clients:
|
||||
|
|
|
|||
|
|
@ -460,7 +460,5 @@ void geni_icc_set_tag(struct geni_se *se, u32 tag);
|
|||
int geni_icc_enable(struct geni_se *se);
|
||||
|
||||
int geni_icc_disable(struct geni_se *se);
|
||||
|
||||
void geni_remove_earlycon_icc_vote(void);
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -193,6 +193,7 @@ enum iscsi_connection_state {
|
|||
ISCSI_CONN_UP = 0,
|
||||
ISCSI_CONN_DOWN,
|
||||
ISCSI_CONN_FAILED,
|
||||
ISCSI_CONN_BOUND,
|
||||
};
|
||||
|
||||
struct iscsi_cls_conn {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue