mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
This is the 4.14.1 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAloT6JYACgkQONu9yGCS aT72KQ/+I0tmoW72a4/Vn8/vgPT7kMiEmb5ITh+ZAS+s3g2gzDV7/xNSN0lM/YLc E8bLIbLDkgVGysH3uqdTMfjOGLs9OtQ/rn8II4f412OzalPEADaR1UR/2eYRl+F6 htlozp1cEZJ3SrLUXRW8Gn4HN6v5u/0LW9HcQcGsmi0a24R3DlWXLJ2l/SolncB8 85asWspXoLj4oUkGkJkKxSknae+AsegWJcAvs3hy1AlPXeb+mPGZV3K8lWhm9jdV 4vl0KqeGan1sNv0kw9jwDGGo8nATLQSSq1Vfl6DKZbKS7Inz8eJoZD9BlQdpSUQ2 dddPCvvcTWZx+2aZY5kHQxrn//9PHaQnCxpPouoO11kp8vENcefBWBEOGcadhvJW oJYOaamyjOJr8powGTtwys9D5JRPQkTS6FJNcUg1rTb4QhHk7ADl0pYo0xuTXaIE rymE6oIJAUzNj5Execsn1fCWwl6/1/ZZTeGkvElazDrR/OmFb9Dqoq3NUovsRd4C h009XonLVaA0lHp+4/Z/QPLR+vgUr/MHp0XgbpdEJ9DokpmScPdpGNVZcwe7es31 pW14doas+4l/VY0CXahCMwh5oJ0eDm6NIeEUnWlo7C/hFfoHhpYWlzNkmgJ3MDyq NwJ6RfpxFV1Lrfs6mZMhWp4gZ6/wXXMD2EbVe8GiHLTjUGDeh0A= =HiFb -----END PGP SIGNATURE----- Merge 4.14.1 into android-4.14 Changes in 4.14.1 EDAC, sb_edac: Don't create a second memory controller if HA1 is not present dmaengine: dmatest: warn user when dma test times out media: imon: Fix null-ptr-deref in imon_probe media: dib0700: fix invalid dvb_detach argument crypto: dh - Fix double free of ctx->p crypto: dh - Don't permit 'p' to be 0 crypto: dh - Don't permit 'key' or 'g' size longer than 'p' crypto: brcm - Explicity ACK mailbox message USB: early: Use new USB product ID and strings for DbC device USB: usbfs: compute urb->actual_length for isochronous USB: Add delay-init quirk for Corsair K70 LUX keyboards usb: gadget: f_fs: Fix use-after-free in ffs_free_inst USB: serial: metro-usb: stop I/O after failed open USB: serial: Change DbC debug device binding ID USB: serial: qcserial: add pid/vid for Sierra Wireless EM7355 fw update USB: serial: garmin_gps: fix I/O after failed probe and remove USB: serial: garmin_gps: fix memory leak on probe errors selftests/x86/protection_keys: Fix syscall NR redefinition warnings x86/MCE/AMD: Always give panic severity for UC errors in kernel context platform/x86: peaq-wmi: Add DMI check before binding to the WMI interface platform/x86: peaq_wmi: Fix missing terminating entry for peaq_dmi_table HID: cp2112: add HIDRAW dependency HID: wacom: generic: Recognize WACOM_HID_WD_PEN as a type of pen collection rpmsg: glink: Add missing MODULE_LICENSE staging: wilc1000: Fix bssid buffer offset in Txq staging: sm750fb: Fix parameter mistake in poke32 staging: ccree: fix 64 bit scatter/gather DMA ops staging: greybus: spilib: fix use-after-free after deregistration staging: vboxvideo: Fix reporting invalid suggested-offset-properties staging: rtl8188eu: Revert 4 commits breaking ARP spi: fix use-after-free at controller deregistration sparc32: Add cmpxchg64(). sparc64: mmu_context: Add missing include files sparc64: Fix page table walk for PUD hugepages Linux 4.14.1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
dc6bfa1865
4
Makefile
4
Makefile
@ -1,9 +1,9 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 0
|
||||
SUBLEVEL = 1
|
||||
EXTRAVERSION =
|
||||
NAME = Fearless Coyote
|
||||
NAME = Petit Gorille
|
||||
|
||||
# *DOCUMENTATION*
|
||||
# To see a list of typical targets execute "make help"
|
||||
|
@ -63,6 +63,9 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)
|
||||
(unsigned long)_n_, sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
u64 __cmpxchg_u64(u64 *ptr, u64 old, u64 new);
|
||||
#define cmpxchg64(ptr, old, new) __cmpxchg_u64(ptr, old, new)
|
||||
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
/*
|
||||
|
@ -8,9 +8,11 @@
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/spitfire.h>
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
#include <asm/percpu.h>
|
||||
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
||||
{
|
||||
|
@ -217,7 +217,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
|
||||
sllx REG2, 32, REG2; \
|
||||
andcc REG1, REG2, %g0; \
|
||||
be,pt %xcc, 700f; \
|
||||
sethi %hi(0x1ffc0000), REG2; \
|
||||
sethi %hi(0xffe00000), REG2; \
|
||||
sllx REG2, 1, REG2; \
|
||||
brgez,pn REG1, FAIL_LABEL; \
|
||||
andn REG1, REG2, REG1; \
|
||||
|
@ -173,6 +173,20 @@ unsigned long __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new)
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_u32);
|
||||
|
||||
u64 __cmpxchg_u64(u64 *ptr, u64 old, u64 new)
|
||||
{
|
||||
unsigned long flags;
|
||||
u64 prev;
|
||||
|
||||
spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
|
||||
if ((prev = *ptr) == old)
|
||||
*ptr = new;
|
||||
spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
|
||||
|
||||
return prev;
|
||||
}
|
||||
EXPORT_SYMBOL(__cmpxchg_u64);
|
||||
|
||||
unsigned long __xchg_u32(volatile u32 *ptr, u32 new)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -245,6 +245,9 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc
|
||||
|
||||
if (m->status & MCI_STATUS_UC) {
|
||||
|
||||
if (ctx == IN_KERNEL)
|
||||
return MCE_PANIC_SEVERITY;
|
||||
|
||||
/*
|
||||
* On older systems where overflow_recov flag is not present, we
|
||||
* should simply panic if an error overflow occurs. If
|
||||
@ -255,10 +258,6 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc
|
||||
if (mce_flags.smca)
|
||||
return mce_severity_amd_smca(m, ctx);
|
||||
|
||||
/* software can try to contain */
|
||||
if (!(m->mcgstatus & MCG_STATUS_RIPV) && (ctx == IN_KERNEL))
|
||||
return MCE_PANIC_SEVERITY;
|
||||
|
||||
/* kill current process */
|
||||
return MCE_AR_SEVERITY;
|
||||
} else {
|
||||
|
33
crypto/dh.c
33
crypto/dh.c
@ -21,19 +21,12 @@ struct dh_ctx {
|
||||
MPI xa;
|
||||
};
|
||||
|
||||
static inline void dh_clear_params(struct dh_ctx *ctx)
|
||||
static void dh_clear_ctx(struct dh_ctx *ctx)
|
||||
{
|
||||
mpi_free(ctx->p);
|
||||
mpi_free(ctx->g);
|
||||
ctx->p = NULL;
|
||||
ctx->g = NULL;
|
||||
}
|
||||
|
||||
static void dh_free_ctx(struct dh_ctx *ctx)
|
||||
{
|
||||
dh_clear_params(ctx);
|
||||
mpi_free(ctx->xa);
|
||||
ctx->xa = NULL;
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -71,10 +64,8 @@ static int dh_set_params(struct dh_ctx *ctx, struct dh *params)
|
||||
return -EINVAL;
|
||||
|
||||
ctx->g = mpi_read_raw_data(params->g, params->g_size);
|
||||
if (!ctx->g) {
|
||||
mpi_free(ctx->p);
|
||||
if (!ctx->g)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -86,21 +77,23 @@ static int dh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
struct dh params;
|
||||
|
||||
/* Free the old MPI key if any */
|
||||
dh_free_ctx(ctx);
|
||||
dh_clear_ctx(ctx);
|
||||
|
||||
if (crypto_dh_decode_key(buf, len, ¶ms) < 0)
|
||||
return -EINVAL;
|
||||
goto err_clear_ctx;
|
||||
|
||||
if (dh_set_params(ctx, ¶ms) < 0)
|
||||
return -EINVAL;
|
||||
goto err_clear_ctx;
|
||||
|
||||
ctx->xa = mpi_read_raw_data(params.key, params.key_size);
|
||||
if (!ctx->xa) {
|
||||
dh_clear_params(ctx);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!ctx->xa)
|
||||
goto err_clear_ctx;
|
||||
|
||||
return 0;
|
||||
|
||||
err_clear_ctx:
|
||||
dh_clear_ctx(ctx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int dh_compute_value(struct kpp_request *req)
|
||||
@ -158,7 +151,7 @@ static void dh_exit_tfm(struct crypto_kpp *tfm)
|
||||
{
|
||||
struct dh_ctx *ctx = dh_get_ctx(tfm);
|
||||
|
||||
dh_free_ctx(ctx);
|
||||
dh_clear_ctx(ctx);
|
||||
}
|
||||
|
||||
static struct kpp_alg dh = {
|
||||
|
@ -83,6 +83,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
||||
if (secret.len != crypto_dh_key_len(params))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Don't permit the buffer for 'key' or 'g' to be larger than 'p', since
|
||||
* some drivers assume otherwise.
|
||||
*/
|
||||
if (params->key_size > params->p_size ||
|
||||
params->g_size > params->p_size)
|
||||
return -EINVAL;
|
||||
|
||||
/* Don't allocate memory. Set pointers to data within
|
||||
* the given buffer
|
||||
*/
|
||||
@ -90,6 +98,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
||||
params->p = (void *)(ptr + params->key_size);
|
||||
params->g = (void *)(ptr + params->key_size + params->p_size);
|
||||
|
||||
/*
|
||||
* Don't permit 'p' to be 0. It's not a prime number, and it's subject
|
||||
* to corner cases such as 'mod 0' being undefined or
|
||||
* crypto_kpp_maxsize() returning 0.
|
||||
*/
|
||||
if (memchr_inv(params->p, 0, params->p_size) == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_dh_decode_key);
|
||||
|
@ -256,6 +256,44 @@ spu_ablkcipher_tx_sg_create(struct brcm_message *mssg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mailbox_send_message(struct brcm_message *mssg, u32 flags,
|
||||
u8 chan_idx)
|
||||
{
|
||||
int err;
|
||||
int retry_cnt = 0;
|
||||
struct device *dev = &(iproc_priv.pdev->dev);
|
||||
|
||||
err = mbox_send_message(iproc_priv.mbox[chan_idx], mssg);
|
||||
if (flags & CRYPTO_TFM_REQ_MAY_SLEEP) {
|
||||
while ((err == -ENOBUFS) && (retry_cnt < SPU_MB_RETRY_MAX)) {
|
||||
/*
|
||||
* Mailbox queue is full. Since MAY_SLEEP is set, assume
|
||||
* not in atomic context and we can wait and try again.
|
||||
*/
|
||||
retry_cnt++;
|
||||
usleep_range(MBOX_SLEEP_MIN, MBOX_SLEEP_MAX);
|
||||
err = mbox_send_message(iproc_priv.mbox[chan_idx],
|
||||
mssg);
|
||||
atomic_inc(&iproc_priv.mb_no_spc);
|
||||
}
|
||||
}
|
||||
if (err < 0) {
|
||||
atomic_inc(&iproc_priv.mb_send_fail);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Check error returned by mailbox controller */
|
||||
err = mssg->error;
|
||||
if (unlikely(err < 0)) {
|
||||
dev_err(dev, "message error %d", err);
|
||||
/* Signal txdone for mailbox channel */
|
||||
}
|
||||
|
||||
/* Signal txdone for mailbox channel */
|
||||
mbox_client_txdone(iproc_priv.mbox[chan_idx], err);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* handle_ablkcipher_req() - Submit as much of a block cipher request as fits in
|
||||
* a single SPU request message, starting at the current position in the request
|
||||
@ -293,7 +331,6 @@ static int handle_ablkcipher_req(struct iproc_reqctx_s *rctx)
|
||||
u32 pad_len; /* total length of all padding */
|
||||
bool update_key = false;
|
||||
struct brcm_message *mssg; /* mailbox message */
|
||||
int retry_cnt = 0;
|
||||
|
||||
/* number of entries in src and dst sg in mailbox message. */
|
||||
u8 rx_frag_num = 2; /* response header and STATUS */
|
||||
@ -462,24 +499,9 @@ static int handle_ablkcipher_req(struct iproc_reqctx_s *rctx)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx], mssg);
|
||||
if (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) {
|
||||
while ((err == -ENOBUFS) && (retry_cnt < SPU_MB_RETRY_MAX)) {
|
||||
/*
|
||||
* Mailbox queue is full. Since MAY_SLEEP is set, assume
|
||||
* not in atomic context and we can wait and try again.
|
||||
*/
|
||||
retry_cnt++;
|
||||
usleep_range(MBOX_SLEEP_MIN, MBOX_SLEEP_MAX);
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx],
|
||||
mssg);
|
||||
atomic_inc(&iproc_priv.mb_no_spc);
|
||||
}
|
||||
}
|
||||
if (unlikely(err < 0)) {
|
||||
atomic_inc(&iproc_priv.mb_send_fail);
|
||||
err = mailbox_send_message(mssg, req->base.flags, rctx->chan_idx);
|
||||
if (unlikely(err < 0))
|
||||
return err;
|
||||
}
|
||||
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
@ -710,7 +732,6 @@ static int handle_ahash_req(struct iproc_reqctx_s *rctx)
|
||||
u32 spu_hdr_len;
|
||||
unsigned int digestsize;
|
||||
u16 rem = 0;
|
||||
int retry_cnt = 0;
|
||||
|
||||
/*
|
||||
* number of entries in src and dst sg. Always includes SPU msg header.
|
||||
@ -904,24 +925,10 @@ static int handle_ahash_req(struct iproc_reqctx_s *rctx)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx], mssg);
|
||||
if (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) {
|
||||
while ((err == -ENOBUFS) && (retry_cnt < SPU_MB_RETRY_MAX)) {
|
||||
/*
|
||||
* Mailbox queue is full. Since MAY_SLEEP is set, assume
|
||||
* not in atomic context and we can wait and try again.
|
||||
*/
|
||||
retry_cnt++;
|
||||
usleep_range(MBOX_SLEEP_MIN, MBOX_SLEEP_MAX);
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx],
|
||||
mssg);
|
||||
atomic_inc(&iproc_priv.mb_no_spc);
|
||||
}
|
||||
}
|
||||
if (err < 0) {
|
||||
atomic_inc(&iproc_priv.mb_send_fail);
|
||||
err = mailbox_send_message(mssg, req->base.flags, rctx->chan_idx);
|
||||
if (unlikely(err < 0))
|
||||
return err;
|
||||
}
|
||||
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
@ -1320,7 +1327,6 @@ static int handle_aead_req(struct iproc_reqctx_s *rctx)
|
||||
int assoc_nents = 0;
|
||||
bool incl_icv = false;
|
||||
unsigned int digestsize = ctx->digestsize;
|
||||
int retry_cnt = 0;
|
||||
|
||||
/* number of entries in src and dst sg. Always includes SPU msg header.
|
||||
*/
|
||||
@ -1558,24 +1564,9 @@ static int handle_aead_req(struct iproc_reqctx_s *rctx)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx], mssg);
|
||||
if (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) {
|
||||
while ((err == -ENOBUFS) && (retry_cnt < SPU_MB_RETRY_MAX)) {
|
||||
/*
|
||||
* Mailbox queue is full. Since MAY_SLEEP is set, assume
|
||||
* not in atomic context and we can wait and try again.
|
||||
*/
|
||||
retry_cnt++;
|
||||
usleep_range(MBOX_SLEEP_MIN, MBOX_SLEEP_MAX);
|
||||
err = mbox_send_message(iproc_priv.mbox[rctx->chan_idx],
|
||||
mssg);
|
||||
atomic_inc(&iproc_priv.mb_no_spc);
|
||||
}
|
||||
}
|
||||
if (err < 0) {
|
||||
atomic_inc(&iproc_priv.mb_send_fail);
|
||||
err = mailbox_send_message(mssg, req->base.flags, rctx->chan_idx);
|
||||
if (unlikely(err < 0))
|
||||
return err;
|
||||
}
|
||||
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
@ -4537,7 +4528,7 @@ static int spu_mb_init(struct device *dev)
|
||||
mcl->dev = dev;
|
||||
mcl->tx_block = false;
|
||||
mcl->tx_tout = 0;
|
||||
mcl->knows_txdone = false;
|
||||
mcl->knows_txdone = true;
|
||||
mcl->rx_callback = spu_rx_callback;
|
||||
mcl->tx_done = NULL;
|
||||
|
||||
|
@ -702,6 +702,7 @@ static int dmatest_func(void *data)
|
||||
* free it this time?" dancing. For now, just
|
||||
* leave it dangling.
|
||||
*/
|
||||
WARN(1, "dmatest: Kernel stack may be corrupted!!\n");
|
||||
dmaengine_unmap_put(um);
|
||||
result("test timed out", total_tests, src_off, dst_off,
|
||||
len, 0);
|
||||
|
@ -462,6 +462,7 @@ static const struct pci_id_table pci_dev_descr_sbridge_table[] = {
|
||||
static const struct pci_id_descr pci_dev_descr_ibridge[] = {
|
||||
/* Processor Home Agent */
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0, 0, IMC0) },
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1, 1, IMC1) },
|
||||
|
||||
/* Memory controller */
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TA, 0, IMC0) },
|
||||
@ -472,7 +473,6 @@ static const struct pci_id_descr pci_dev_descr_ibridge[] = {
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA0_TAD3, 0, IMC0) },
|
||||
|
||||
/* Optional, mode 2HA */
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1, 1, IMC1) },
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1_TA, 1, IMC1) },
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1_RAS, 1, IMC1) },
|
||||
{ PCI_DESCR(PCI_DEVICE_ID_INTEL_IBRIDGE_IMC_HA1_TAD0, 1, IMC1) },
|
||||
@ -2291,6 +2291,13 @@ static int sbridge_get_onedevice(struct pci_dev **prev,
|
||||
next_imc:
|
||||
sbridge_dev = get_sbridge_dev(bus, dev_descr->dom, multi_bus, sbridge_dev);
|
||||
if (!sbridge_dev) {
|
||||
/* If the HA1 wasn't found, don't create EDAC second memory controller */
|
||||
if (dev_descr->dom == IMC1 && devno != 1) {
|
||||
edac_dbg(0, "Skip IMC1: %04x:%04x (since HA1 was absent)\n",
|
||||
PCI_VENDOR_ID_INTEL, dev_descr->dev_id);
|
||||
pci_dev_put(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dev_descr->dom == SOCK)
|
||||
goto out_imc;
|
||||
|
@ -230,7 +230,7 @@ config HID_CMEDIA
|
||||
|
||||
config HID_CP2112
|
||||
tristate "Silicon Labs CP2112 HID USB-to-SMBus Bridge support"
|
||||
depends on USB_HID && I2C && GPIOLIB
|
||||
depends on USB_HID && HIDRAW && I2C && GPIOLIB
|
||||
select GPIOLIB_IRQCHIP
|
||||
---help---
|
||||
Support for Silicon Labs CP2112 HID USB to SMBus Master Bridge.
|
||||
|
@ -166,6 +166,7 @@
|
||||
((f)->physical == HID_DG_PEN) || \
|
||||
((f)->application == HID_DG_PEN) || \
|
||||
((f)->application == HID_DG_DIGITIZER) || \
|
||||
((f)->application == WACOM_HID_WD_PEN) || \
|
||||
((f)->application == WACOM_HID_WD_DIGITIZER) || \
|
||||
((f)->application == WACOM_HID_G9_PEN) || \
|
||||
((f)->application == WACOM_HID_G11_PEN))
|
||||
|
@ -2517,6 +2517,11 @@ static int imon_probe(struct usb_interface *interface,
|
||||
mutex_lock(&driver_lock);
|
||||
|
||||
first_if = usb_ifnum_to_if(usbdev, 0);
|
||||
if (!first_if) {
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
first_if_ctx = usb_get_intfdata(first_if);
|
||||
|
||||
if (ifnum == 0) {
|
||||
|
@ -291,7 +291,7 @@ static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7700d_dib7000p_mt2266_config)
|
||||
!= 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@ -325,7 +325,7 @@ static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7700d_dib7000p_mt2266_config)
|
||||
!= 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@ -478,7 +478,7 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&stk7700ph_dib7700_xc3028_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1010,7 +1010,7 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&dib7070p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1068,7 +1068,7 @@ static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&dib7770p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -3056,7 +3056,7 @@ static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
|
||||
@ -3109,7 +3109,7 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
|
||||
/* initialize IC 0 */
|
||||
if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -3139,7 +3139,7 @@ static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
|
||||
i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
|
||||
if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -3214,7 +3214,7 @@ static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
1, 0x10, &tfe7790p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
|
||||
@ -3309,7 +3309,7 @@ static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
|
||||
stk7070pd_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -3384,7 +3384,7 @@ static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7070pd_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@ -3620,7 +3620,7 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
|
||||
/* Demodulator not found for some reason? */
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/input-polldev.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@ -64,8 +65,23 @@ static void peaq_wmi_poll(struct input_polled_dev *dev)
|
||||
}
|
||||
}
|
||||
|
||||
/* Some other devices (Shuttle XS35) use the same WMI GUID for other purposes */
|
||||
static const struct dmi_system_id peaq_dmi_table[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "PEAQ"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PEAQ PMM C1010 MD99187"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int __init peaq_wmi_init(void)
|
||||
{
|
||||
/* WMI GUID is not unique, also check for a DMI match */
|
||||
if (!dmi_check_system(peaq_dmi_table))
|
||||
return -ENODEV;
|
||||
|
||||
if (!wmi_has_guid(PEAQ_DOLBY_BUTTON_GUID))
|
||||
return -ENODEV;
|
||||
|
||||
@ -86,6 +102,9 @@ static int __init peaq_wmi_init(void)
|
||||
|
||||
static void __exit peaq_wmi_exit(void)
|
||||
{
|
||||
if (!dmi_check_system(peaq_dmi_table))
|
||||
return;
|
||||
|
||||
if (!wmi_has_guid(PEAQ_DOLBY_BUTTON_GUID))
|
||||
return;
|
||||
|
||||
|
@ -1616,3 +1616,6 @@ void qcom_glink_native_unregister(struct qcom_glink *glink)
|
||||
device_unregister(glink->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_glink_native_unregister);
|
||||
|
||||
MODULE_DESCRIPTION("Qualcomm GLINK driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -2245,11 +2245,12 @@ static int __unregister(struct device *dev, void *null)
|
||||
void spi_unregister_controller(struct spi_controller *ctlr)
|
||||
{
|
||||
struct spi_controller *found;
|
||||
int id = ctlr->bus_num;
|
||||
int dummy;
|
||||
|
||||
/* First make sure that this controller was ever added */
|
||||
mutex_lock(&board_lock);
|
||||
found = idr_find(&spi_master_idr, ctlr->bus_num);
|
||||
found = idr_find(&spi_master_idr, id);
|
||||
mutex_unlock(&board_lock);
|
||||
if (found != ctlr) {
|
||||
dev_dbg(&ctlr->dev,
|
||||
@ -2269,7 +2270,7 @@ void spi_unregister_controller(struct spi_controller *ctlr)
|
||||
device_unregister(&ctlr->dev);
|
||||
/* free bus id */
|
||||
mutex_lock(&board_lock);
|
||||
idr_remove(&spi_master_idr, ctlr->bus_num);
|
||||
idr_remove(&spi_master_idr, id);
|
||||
mutex_unlock(&board_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(spi_unregister_controller);
|
||||
|
@ -59,7 +59,7 @@ static inline void cc_lli_set_addr(u32 *lli_p, dma_addr_t addr)
|
||||
lli_p[LLI_WORD0_OFFSET] = (addr & U32_MAX);
|
||||
#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
|
||||
lli_p[LLI_WORD1_OFFSET] &= ~LLI_HADDR_MASK;
|
||||
lli_p[LLI_WORD1_OFFSET] |= FIELD_PREP(LLI_HADDR_MASK, (addr >> 16));
|
||||
lli_p[LLI_WORD1_OFFSET] |= FIELD_PREP(LLI_HADDR_MASK, (addr >> 32));
|
||||
#endif /* CONFIG_ARCH_DMA_ADDR_T_64BIT */
|
||||
}
|
||||
|
||||
|
@ -544,11 +544,14 @@ int gb_spilib_master_init(struct gb_connection *connection, struct device *dev,
|
||||
|
||||
return 0;
|
||||
|
||||
exit_spi_unregister:
|
||||
spi_unregister_master(master);
|
||||
exit_spi_put:
|
||||
spi_master_put(master);
|
||||
|
||||
return ret;
|
||||
|
||||
exit_spi_unregister:
|
||||
spi_unregister_master(master);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gb_spilib_master_init);
|
||||
@ -558,7 +561,6 @@ void gb_spilib_master_exit(struct gb_connection *connection)
|
||||
struct spi_master *master = gb_connection_get_data(connection);
|
||||
|
||||
spi_unregister_master(master);
|
||||
spi_master_put(master);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gb_spilib_master_exit);
|
||||
|
||||
|
@ -259,10 +259,12 @@ static int recvframe_chkmic(struct adapter *adapter,
|
||||
}
|
||||
|
||||
/* icv_len included the mic code */
|
||||
datalen = precvframe->pkt->len-prxattrib->hdrlen - 8;
|
||||
datalen = precvframe->pkt->len-prxattrib->hdrlen -
|
||||
prxattrib->iv_len-prxattrib->icv_len-8;
|
||||
pframe = precvframe->pkt->data;
|
||||
payload = pframe+prxattrib->hdrlen;
|
||||
payload = pframe+prxattrib->hdrlen+prxattrib->iv_len;
|
||||
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n prxattrib->iv_len=%d prxattrib->icv_len=%d\n", prxattrib->iv_len, prxattrib->icv_len));
|
||||
rtw_seccalctkipmic(mickey, pframe, payload, datalen, &miccode[0],
|
||||
(unsigned char)prxattrib->priority); /* care the length of the data */
|
||||
|
||||
@ -407,15 +409,9 @@ static struct recv_frame *decryptor(struct adapter *padapter,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (res != _FAIL) {
|
||||
memmove(precv_frame->pkt->data + precv_frame->attrib.iv_len, precv_frame->pkt->data, precv_frame->attrib.hdrlen);
|
||||
skb_pull(precv_frame->pkt, precv_frame->attrib.iv_len);
|
||||
skb_trim(precv_frame->pkt, precv_frame->pkt->len - precv_frame->attrib.icv_len);
|
||||
}
|
||||
} else if (prxattrib->bdecrypted == 1 && prxattrib->encrypt > 0 &&
|
||||
(psecuritypriv->busetkipkey == 1 || prxattrib->encrypt != _TKIP_)) {
|
||||
psecuritypriv->hw_decrypted = true;
|
||||
}
|
||||
(psecuritypriv->busetkipkey == 1 || prxattrib->encrypt != _TKIP_))
|
||||
psecuritypriv->hw_decrypted = true;
|
||||
|
||||
if (res == _FAIL) {
|
||||
rtw_free_recvframe(return_packet, &padapter->recvpriv.free_recv_queue);
|
||||
@ -456,7 +452,7 @@ static struct recv_frame *portctrl(struct adapter *adapter,
|
||||
|
||||
if (auth_alg == 2) {
|
||||
/* get ether_type */
|
||||
ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE;
|
||||
ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE + pfhdr->attrib.iv_len;
|
||||
memcpy(&be_tmp, ptr, 2);
|
||||
ether_type = ntohs(be_tmp);
|
||||
|
||||
@ -1138,8 +1134,6 @@ static int validate_recv_data_frame(struct adapter *adapter,
|
||||
}
|
||||
|
||||
if (pattrib->privacy) {
|
||||
struct sk_buff *skb = precv_frame->pkt;
|
||||
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("validate_recv_data_frame:pattrib->privacy=%x\n", pattrib->privacy));
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n ^^^^^^^^^^^IS_MCAST(pattrib->ra(0x%02x))=%d^^^^^^^^^^^^^^^6\n", pattrib->ra[0], IS_MCAST(pattrib->ra)));
|
||||
|
||||
@ -1148,13 +1142,6 @@ static int validate_recv_data_frame(struct adapter *adapter,
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("\n pattrib->encrypt=%d\n", pattrib->encrypt));
|
||||
|
||||
SET_ICE_IV_LEN(pattrib->iv_len, pattrib->icv_len, pattrib->encrypt);
|
||||
|
||||
if (pattrib->bdecrypted == 1 && pattrib->encrypt > 0) {
|
||||
memmove(skb->data + pattrib->iv_len,
|
||||
skb->data, pattrib->hdrlen);
|
||||
skb_pull(skb, pattrib->iv_len);
|
||||
skb_trim(skb, skb->len - pattrib->icv_len);
|
||||
}
|
||||
} else {
|
||||
pattrib->encrypt = 0;
|
||||
pattrib->iv_len = 0;
|
||||
@ -1274,7 +1261,6 @@ static int validate_recv_frame(struct adapter *adapter,
|
||||
* Hence forward the frame to the monitor anyway to preserve the order
|
||||
* in which frames were received.
|
||||
*/
|
||||
|
||||
rtl88eu_mon_recv_hook(adapter->pmondev, precv_frame);
|
||||
|
||||
exit:
|
||||
@ -1296,8 +1282,11 @@ static int wlanhdr_to_ethhdr(struct recv_frame *precvframe)
|
||||
u8 *ptr = precvframe->pkt->data;
|
||||
struct rx_pkt_attrib *pattrib = &precvframe->attrib;
|
||||
|
||||
psnap = (struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen);
|
||||
psnap_type = ptr+pattrib->hdrlen + SNAP_SIZE;
|
||||
if (pattrib->encrypt)
|
||||
skb_trim(precvframe->pkt, precvframe->pkt->len - pattrib->icv_len);
|
||||
|
||||
psnap = (struct ieee80211_snap_hdr *)(ptr+pattrib->hdrlen + pattrib->iv_len);
|
||||
psnap_type = ptr+pattrib->hdrlen + pattrib->iv_len+SNAP_SIZE;
|
||||
/* convert hdr + possible LLC headers into Ethernet header */
|
||||
if ((!memcmp(psnap, rtw_rfc1042_header, SNAP_SIZE) &&
|
||||
(!memcmp(psnap_type, SNAP_ETH_TYPE_IPX, 2) == false) &&
|
||||
@ -1310,9 +1299,12 @@ static int wlanhdr_to_ethhdr(struct recv_frame *precvframe)
|
||||
bsnaphdr = false;
|
||||
}
|
||||
|
||||
rmv_len = pattrib->hdrlen + (bsnaphdr ? SNAP_SIZE : 0);
|
||||
rmv_len = pattrib->hdrlen + pattrib->iv_len + (bsnaphdr ? SNAP_SIZE : 0);
|
||||
len = precvframe->pkt->len - rmv_len;
|
||||
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
|
||||
("\n===pattrib->hdrlen: %x, pattrib->iv_len:%x===\n\n", pattrib->hdrlen, pattrib->iv_len));
|
||||
|
||||
memcpy(&be_tmp, ptr+rmv_len, 2);
|
||||
eth_type = ntohs(be_tmp); /* pattrib->ether_type */
|
||||
pattrib->eth_type = eth_type;
|
||||
@ -1337,6 +1329,7 @@ static struct recv_frame *recvframe_defrag(struct adapter *adapter,
|
||||
struct __queue *defrag_q)
|
||||
{
|
||||
struct list_head *plist, *phead;
|
||||
u8 wlanhdr_offset;
|
||||
u8 curfragnum;
|
||||
struct recv_frame *pfhdr, *pnfhdr;
|
||||
struct recv_frame *prframe, *pnextrframe;
|
||||
@ -1385,7 +1378,12 @@ static struct recv_frame *recvframe_defrag(struct adapter *adapter,
|
||||
/* copy the 2nd~n fragment frame's payload to the first fragment */
|
||||
/* get the 2nd~last fragment frame's payload */
|
||||
|
||||
skb_pull(pnextrframe->pkt, pnfhdr->attrib.hdrlen);
|
||||
wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
|
||||
|
||||
skb_pull(pnextrframe->pkt, wlanhdr_offset);
|
||||
|
||||
/* append to first fragment frame's tail (if privacy frame, pull the ICV) */
|
||||
skb_trim(prframe->pkt, prframe->pkt->len - pfhdr->attrib.icv_len);
|
||||
|
||||
/* memcpy */
|
||||
memcpy(skb_tail_pointer(pfhdr->pkt), pnfhdr->pkt->data,
|
||||
@ -1393,7 +1391,7 @@ static struct recv_frame *recvframe_defrag(struct adapter *adapter,
|
||||
|
||||
skb_put(prframe->pkt, pnfhdr->pkt->len);
|
||||
|
||||
pfhdr->attrib.icv_len = 0;
|
||||
pfhdr->attrib.icv_len = pnfhdr->attrib.icv_len;
|
||||
plist = plist->next;
|
||||
}
|
||||
|
||||
@ -1519,6 +1517,11 @@ static int amsdu_to_msdu(struct adapter *padapter, struct recv_frame *prframe)
|
||||
nr_subframes = 0;
|
||||
pattrib = &prframe->attrib;
|
||||
|
||||
skb_pull(prframe->pkt, prframe->attrib.hdrlen);
|
||||
|
||||
if (prframe->attrib.iv_len > 0)
|
||||
skb_pull(prframe->pkt, prframe->attrib.iv_len);
|
||||
|
||||
a_len = prframe->pkt->len;
|
||||
|
||||
pdata = prframe->pkt->data;
|
||||
@ -1887,6 +1890,24 @@ static int process_recv_indicatepkts(struct adapter *padapter,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int recv_func_prehandle(struct adapter *padapter,
|
||||
struct recv_frame *rframe)
|
||||
{
|
||||
int ret = _SUCCESS;
|
||||
struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
|
||||
|
||||
/* check the frame crtl field and decache */
|
||||
ret = validate_recv_frame(padapter, rframe);
|
||||
if (ret != _SUCCESS) {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n"));
|
||||
rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int recv_func_posthandle(struct adapter *padapter,
|
||||
struct recv_frame *prframe)
|
||||
{
|
||||
@ -1939,7 +1960,6 @@ static int recv_func(struct adapter *padapter, struct recv_frame *rframe)
|
||||
struct rx_pkt_attrib *prxattrib = &rframe->attrib;
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
struct mlme_priv *mlmepriv = &padapter->mlmepriv;
|
||||
struct __queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
|
||||
|
||||
/* check if need to handle uc_swdec_pending_queue*/
|
||||
if (check_fwstate(mlmepriv, WIFI_STATION_STATE) && psecuritypriv->busetkipkey) {
|
||||
@ -1951,12 +1971,9 @@ static int recv_func(struct adapter *padapter, struct recv_frame *rframe)
|
||||
}
|
||||
}
|
||||
|
||||
/* check the frame crtl field and decache */
|
||||
ret = validate_recv_frame(padapter, rframe);
|
||||
if (ret != _SUCCESS) {
|
||||
RT_TRACE(_module_rtl871x_recv_c_, _drv_info_, ("recv_func: validate_recv_frame fail! drop pkt\n"));
|
||||
rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */
|
||||
} else {
|
||||
ret = recv_func_prehandle(padapter, rframe);
|
||||
|
||||
if (ret == _SUCCESS) {
|
||||
/* check if need to enqueue into uc_swdec_pending_queue*/
|
||||
if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
|
||||
!IS_MCAST(prxattrib->ra) && prxattrib->encrypt > 0 &&
|
||||
|
@ -66,34 +66,6 @@ static void mon_recv_decrypted(struct net_device *dev, const u8 *data,
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
static void mon_recv_decrypted_recv(struct net_device *dev, const u8 *data,
|
||||
int data_len)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_hdr *hdr;
|
||||
int hdr_len;
|
||||
|
||||
skb = netdev_alloc_skb(dev, data_len);
|
||||
if (!skb)
|
||||
return;
|
||||
memcpy(skb_put(skb, data_len), data, data_len);
|
||||
|
||||
/*
|
||||
* Frame data is not encrypted. Strip off protection so
|
||||
* userspace doesn't think that it is.
|
||||
*/
|
||||
|
||||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
hdr_len = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
if (ieee80211_has_protected(hdr->frame_control))
|
||||
hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_PROTECTED);
|
||||
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
static void mon_recv_encrypted(struct net_device *dev, const u8 *data,
|
||||
int data_len)
|
||||
{
|
||||
@ -110,6 +82,7 @@ static void mon_recv_encrypted(struct net_device *dev, const u8 *data,
|
||||
void rtl88eu_mon_recv_hook(struct net_device *dev, struct recv_frame *frame)
|
||||
{
|
||||
struct rx_pkt_attrib *attr;
|
||||
int iv_len, icv_len;
|
||||
int data_len;
|
||||
u8 *data;
|
||||
|
||||
@ -122,8 +95,11 @@ void rtl88eu_mon_recv_hook(struct net_device *dev, struct recv_frame *frame)
|
||||
data = frame->pkt->data;
|
||||
data_len = frame->pkt->len;
|
||||
|
||||
/* Broadcast and multicast frames don't have attr->{iv,icv}_len set */
|
||||
SET_ICE_IV_LEN(iv_len, icv_len, attr->encrypt);
|
||||
|
||||
if (attr->bdecrypted)
|
||||
mon_recv_decrypted_recv(dev, data, data_len);
|
||||
mon_recv_decrypted(dev, data, data_len, iv_len, icv_len);
|
||||
else
|
||||
mon_recv_encrypted(dev, data, data_len);
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ static inline u32 peek32(u32 addr)
|
||||
return readl(addr + mmio750);
|
||||
}
|
||||
|
||||
static inline void poke32(u32 data, u32 addr)
|
||||
static inline void poke32(u32 addr, u32 data)
|
||||
{
|
||||
writel(data, addr + mmio750);
|
||||
}
|
||||
|
@ -137,8 +137,8 @@ struct vbox_connector {
|
||||
char name[32];
|
||||
struct vbox_crtc *vbox_crtc;
|
||||
struct {
|
||||
u16 width;
|
||||
u16 height;
|
||||
u32 width;
|
||||
u32 height;
|
||||
bool disconnected;
|
||||
} mode_hint;
|
||||
};
|
||||
@ -150,8 +150,8 @@ struct vbox_crtc {
|
||||
unsigned int crtc_id;
|
||||
u32 fb_offset;
|
||||
bool cursor_enabled;
|
||||
u16 x_hint;
|
||||
u16 y_hint;
|
||||
u32 x_hint;
|
||||
u32 y_hint;
|
||||
};
|
||||
|
||||
struct vbox_encoder {
|
||||
|
@ -150,8 +150,8 @@ static void vbox_update_mode_hints(struct vbox_private *vbox)
|
||||
|
||||
disconnected = !(hints->enabled);
|
||||
crtc_id = vbox_conn->vbox_crtc->crtc_id;
|
||||
vbox_conn->mode_hint.width = hints->cx & 0x8fff;
|
||||
vbox_conn->mode_hint.height = hints->cy & 0x8fff;
|
||||
vbox_conn->mode_hint.width = hints->cx;
|
||||
vbox_conn->mode_hint.height = hints->cy;
|
||||
vbox_conn->vbox_crtc->x_hint = hints->dx;
|
||||
vbox_conn->vbox_crtc->y_hint = hints->dy;
|
||||
vbox_conn->mode_hint.disconnected = disconnected;
|
||||
|
@ -553,12 +553,22 @@ static int vbox_get_modes(struct drm_connector *connector)
|
||||
++num_modes;
|
||||
}
|
||||
vbox_set_edid(connector, preferred_width, preferred_height);
|
||||
drm_object_property_set_value(
|
||||
&connector->base, vbox->dev->mode_config.suggested_x_property,
|
||||
vbox_connector->vbox_crtc->x_hint);
|
||||
drm_object_property_set_value(
|
||||
&connector->base, vbox->dev->mode_config.suggested_y_property,
|
||||
vbox_connector->vbox_crtc->y_hint);
|
||||
|
||||
if (vbox_connector->vbox_crtc->x_hint != -1)
|
||||
drm_object_property_set_value(&connector->base,
|
||||
vbox->dev->mode_config.suggested_x_property,
|
||||
vbox_connector->vbox_crtc->x_hint);
|
||||
else
|
||||
drm_object_property_set_value(&connector->base,
|
||||
vbox->dev->mode_config.suggested_x_property, 0);
|
||||
|
||||
if (vbox_connector->vbox_crtc->y_hint != -1)
|
||||
drm_object_property_set_value(&connector->base,
|
||||
vbox->dev->mode_config.suggested_y_property,
|
||||
vbox_connector->vbox_crtc->y_hint);
|
||||
else
|
||||
drm_object_property_set_value(&connector->base,
|
||||
vbox->dev->mode_config.suggested_y_property, 0);
|
||||
|
||||
return num_modes;
|
||||
}
|
||||
@ -640,9 +650,9 @@ static int vbox_connector_init(struct drm_device *dev,
|
||||
|
||||
drm_mode_create_suggested_offset_properties(dev);
|
||||
drm_object_attach_property(&connector->base,
|
||||
dev->mode_config.suggested_x_property, -1);
|
||||
dev->mode_config.suggested_x_property, 0);
|
||||
drm_object_attach_property(&connector->base,
|
||||
dev->mode_config.suggested_y_property, -1);
|
||||
dev->mode_config.suggested_y_property, 0);
|
||||
drm_connector_register(connector);
|
||||
|
||||
drm_mode_connector_attach_encoder(connector, encoder);
|
||||
|
@ -714,7 +714,7 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
|
||||
char *bssid = ((struct tx_complete_data *)(tqe->priv))->bssid;
|
||||
|
||||
buffer_offset = ETH_ETHERNET_HDR_OFFSET;
|
||||
memcpy(&txb[offset + 4], bssid, 6);
|
||||
memcpy(&txb[offset + 8], bssid, 6);
|
||||
} else {
|
||||
buffer_offset = HOST_HDR_OFFSET;
|
||||
}
|
||||
|
@ -1833,6 +1833,18 @@ static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void compute_isochronous_actual_length(struct urb *urb)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (urb->number_of_packets > 0) {
|
||||
urb->actual_length = 0;
|
||||
for (i = 0; i < urb->number_of_packets; i++)
|
||||
urb->actual_length +=
|
||||
urb->iso_frame_desc[i].actual_length;
|
||||
}
|
||||
}
|
||||
|
||||
static int processcompl(struct async *as, void __user * __user *arg)
|
||||
{
|
||||
struct urb *urb = as->urb;
|
||||
@ -1840,6 +1852,7 @@ static int processcompl(struct async *as, void __user * __user *arg)
|
||||
void __user *addr = as->userurb;
|
||||
unsigned int i;
|
||||
|
||||
compute_isochronous_actual_length(urb);
|
||||
if (as->userbuffer && urb->actual_length) {
|
||||
if (copy_urb_data_to_user(as->userbuffer, urb))
|
||||
goto err_out;
|
||||
@ -2008,6 +2021,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
|
||||
void __user *addr = as->userurb;
|
||||
unsigned int i;
|
||||
|
||||
compute_isochronous_actual_length(urb);
|
||||
if (as->userbuffer && urb->actual_length) {
|
||||
if (copy_urb_data_to_user(as->userbuffer, urb))
|
||||
return -EFAULT;
|
||||
|
@ -221,6 +221,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Corsair Strafe RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Corsair K70 LUX */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* MIDI keyboard WORLDE MINI */
|
||||
{ USB_DEVICE(0x1c75, 0x0204), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
@ -90,8 +90,8 @@ struct xdbc_context {
|
||||
|
||||
#define XDBC_INFO_CONTEXT_SIZE 48
|
||||
#define XDBC_MAX_STRING_LENGTH 64
|
||||
#define XDBC_STRING_MANUFACTURER "Linux"
|
||||
#define XDBC_STRING_PRODUCT "Remote GDB"
|
||||
#define XDBC_STRING_MANUFACTURER "Linux Foundation"
|
||||
#define XDBC_STRING_PRODUCT "Linux USB GDB Target"
|
||||
#define XDBC_STRING_SERIAL "0001"
|
||||
|
||||
struct xdbc_strings {
|
||||
@ -103,7 +103,7 @@ struct xdbc_strings {
|
||||
|
||||
#define XDBC_PROTOCOL 1 /* GNU Remote Debug Command Set */
|
||||
#define XDBC_VENDOR_ID 0x1d6b /* Linux Foundation 0x1d6b */
|
||||
#define XDBC_PRODUCT_ID 0x0004 /* __le16 idProduct; device 0004 */
|
||||
#define XDBC_PRODUCT_ID 0x0011 /* __le16 idProduct; device 0011 */
|
||||
#define XDBC_DEVICE_REV 0x0010 /* 0.10 */
|
||||
|
||||
/*
|
||||
|
@ -3677,6 +3677,7 @@ static void ffs_closed(struct ffs_data *ffs)
|
||||
goto done;
|
||||
|
||||
ffs_obj->desc_ready = false;
|
||||
ffs_obj->ffs_data = NULL;
|
||||
|
||||
if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags) &&
|
||||
ffs_obj->ffs_closed_callback)
|
||||
|
@ -138,6 +138,7 @@ struct garmin_data {
|
||||
__u8 privpkt[4*6];
|
||||
spinlock_t lock;
|
||||
struct list_head pktlist;
|
||||
struct usb_anchor write_urbs;
|
||||
};
|
||||
|
||||
|
||||
@ -905,13 +906,19 @@ static int garmin_init_session(struct usb_serial_port *port)
|
||||
sizeof(GARMIN_START_SESSION_REQ), 0);
|
||||
|
||||
if (status < 0)
|
||||
break;
|
||||
goto err_kill_urbs;
|
||||
}
|
||||
|
||||
if (status > 0)
|
||||
status = 0;
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
err_kill_urbs:
|
||||
usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
|
||||
usb_kill_urb(port->interrupt_in_urb);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -930,7 +937,6 @@ static int garmin_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
spin_unlock_irqrestore(&garmin_data_p->lock, flags);
|
||||
|
||||
/* shutdown any bulk reads that might be going on */
|
||||
usb_kill_urb(port->write_urb);
|
||||
usb_kill_urb(port->read_urb);
|
||||
|
||||
if (garmin_data_p->state == STATE_RESET)
|
||||
@ -953,7 +959,7 @@ static void garmin_close(struct usb_serial_port *port)
|
||||
|
||||
/* shutdown our urbs */
|
||||
usb_kill_urb(port->read_urb);
|
||||
usb_kill_urb(port->write_urb);
|
||||
usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
|
||||
|
||||
/* keep reset state so we know that we must start a new session */
|
||||
if (garmin_data_p->state != STATE_RESET)
|
||||
@ -1037,12 +1043,14 @@ static int garmin_write_bulk(struct usb_serial_port *port,
|
||||
}
|
||||
|
||||
/* send it down the pipe */
|
||||
usb_anchor_urb(urb, &garmin_data_p->write_urbs);
|
||||
status = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (status) {
|
||||
dev_err(&port->dev,
|
||||
"%s - usb_submit_urb(write bulk) failed with status = %d\n",
|
||||
__func__, status);
|
||||
count = status;
|
||||
usb_unanchor_urb(urb);
|
||||
kfree(buffer);
|
||||
}
|
||||
|
||||
@ -1401,9 +1409,16 @@ static int garmin_port_probe(struct usb_serial_port *port)
|
||||
garmin_data_p->state = 0;
|
||||
garmin_data_p->flags = 0;
|
||||
garmin_data_p->count = 0;
|
||||
init_usb_anchor(&garmin_data_p->write_urbs);
|
||||
usb_set_serial_port_data(port, garmin_data_p);
|
||||
|
||||
status = garmin_init_session(port);
|
||||
if (status)
|
||||
goto err_free;
|
||||
|
||||
return 0;
|
||||
err_free:
|
||||
kfree(garmin_data_p);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -1413,6 +1428,7 @@ static int garmin_port_remove(struct usb_serial_port *port)
|
||||
{
|
||||
struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
|
||||
|
||||
usb_kill_anchored_urbs(&garmin_data_p->write_urbs);
|
||||
usb_kill_urb(port->interrupt_in_urb);
|
||||
del_timer_sync(&garmin_data_p->timer);
|
||||
kfree(garmin_data_p);
|
||||
|
@ -189,7 +189,7 @@ static int metrousb_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
dev_err(&port->dev,
|
||||
"%s - failed submitting interrupt in urb, error code=%d\n",
|
||||
__func__, result);
|
||||
goto exit;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Send activate cmd to device */
|
||||
@ -198,9 +198,14 @@ static int metrousb_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
dev_err(&port->dev,
|
||||
"%s - failed to configure device, error code=%d\n",
|
||||
__func__, result);
|
||||
goto exit;
|
||||
goto err_kill_urb;
|
||||
}
|
||||
exit:
|
||||
|
||||
return 0;
|
||||
|
||||
err_kill_urb:
|
||||
usb_kill_urb(port->interrupt_in_urb);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -148,6 +148,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */
|
||||
{DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC7304/MC7354 */
|
||||
{DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */
|
||||
{DEVICE_SWI(0x1199, 0x901e)}, /* Sierra Wireless EM7355 QDL */
|
||||
{DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */
|
||||
{DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */
|
||||
{DEVICE_SWI(0x1199, 0x9041)}, /* Sierra Wireless MC7305/MC7355 */
|
||||
|
@ -34,13 +34,13 @@ static const struct usb_device_id id_table[] = {
|
||||
};
|
||||
|
||||
static const struct usb_device_id dbc_id_table[] = {
|
||||
{ USB_DEVICE(0x1d6b, 0x0004) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0011) },
|
||||
{ },
|
||||
};
|
||||
|
||||
static const struct usb_device_id id_table_combined[] = {
|
||||
{ USB_DEVICE(0x0525, 0x127a) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0004) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0011) },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table_combined);
|
||||
|
@ -189,17 +189,29 @@ void lots_o_noops_around_write(int *write_to_me)
|
||||
#define u64 uint64_t
|
||||
|
||||
#ifdef __i386__
|
||||
#define SYS_mprotect_key 380
|
||||
#define SYS_pkey_alloc 381
|
||||
#define SYS_pkey_free 382
|
||||
|
||||
#ifndef SYS_mprotect_key
|
||||
# define SYS_mprotect_key 380
|
||||
#endif
|
||||
#ifndef SYS_pkey_alloc
|
||||
# define SYS_pkey_alloc 381
|
||||
# define SYS_pkey_free 382
|
||||
#endif
|
||||
#define REG_IP_IDX REG_EIP
|
||||
#define si_pkey_offset 0x14
|
||||
|
||||
#else
|
||||
#define SYS_mprotect_key 329
|
||||
#define SYS_pkey_alloc 330
|
||||
#define SYS_pkey_free 331
|
||||
|
||||
#ifndef SYS_mprotect_key
|
||||
# define SYS_mprotect_key 329
|
||||
#endif
|
||||
#ifndef SYS_pkey_alloc
|
||||
# define SYS_pkey_alloc 330
|
||||
# define SYS_pkey_free 331
|
||||
#endif
|
||||
#define REG_IP_IDX REG_RIP
|
||||
#define si_pkey_offset 0x20
|
||||
|
||||
#endif
|
||||
|
||||
void dump_mem(void *dumpme, int len_bytes)
|
||||
|
Loading…
x
Reference in New Issue
Block a user