Char/Misc driver fixes for 6.2-rc5
Here are some small char/misc and other subsystem driver fixes for 6.2-rc5 to resolve a few reported issues. They include: - long time pending fastrpc fixes (should have gone into 6.1, my fault.) - mei driver/bus fixes and new device ids - interconnect driver fixes for reported problems - vmci bugfix - w1 driver bugfixes for reported problems Almost all of these have been in linux-next with no reported problems, the rest have all passed 0-day bot testing in my tree and on the mailing lists where they have sat too long due to me taking a long time to catch up on my pending patch queue. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCY8wBNA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yk30QCgrdhgSnL4s2o/y0L/nkB4ubg9spkAoJtmRHe4 EYj/RIm7VYef65aIElVT =Cj+i -----END PGP SIGNATURE----- Merge tag 'char-misc-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char/misc driver fixes from Greg KH: "Here are some small char/misc and other subsystem driver fixes for 6.2-rc5 to resolve a few reported issues. They include: - long time pending fastrpc fixes (should have gone into 6.1, my fault) - mei driver/bus fixes and new device ids - interconnect driver fixes for reported problems - vmci bugfix - w1 driver bugfixes for reported problems Almost all of these have been in linux-next with no reported problems, the rest have all passed 0-day bot testing in my tree and on the mailing lists where they have sat too long due to me taking a long time to catch up on my pending patch queue" * tag 'char-misc-6.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: VMCI: Use threaded irqs instead of tasklets misc: fastrpc: Pass bitfield into qcom_scm_assign_mem gsmi: fix null-deref in gsmi_get_variable misc: fastrpc: Fix use-after-free race condition for maps misc: fastrpc: Don't remove map on creater_process and device_release misc: fastrpc: Fix use-after-free and race in fastrpc_map_find misc: fastrpc: fix error code in fastrpc_req_mmap() mei: me: add meteor lake point M DID mei: bus: fix unlink on bus in error path w1: fix WARNING after calling w1_process() w1: fix deadloop in __w1_remove_master_device() comedi: adv_pci1760: Fix PWM instruction handling interconnect: qcom: rpm: Use _optional func for provider clocks interconnect: qcom: msm8996: Fix regmap max_register values interconnect: qcom: msm8996: Provide UFS clocks to A2NoC dt-bindings: interconnect: Add UFS clocks to MSM8996 A2NoC
This commit is contained in:
Коммит
f671440228
|
@ -84,7 +84,6 @@ allOf:
|
|||
- qcom,msm8939-pcnoc
|
||||
- qcom,msm8939-snoc
|
||||
- qcom,msm8996-a1noc
|
||||
- qcom,msm8996-a2noc
|
||||
- qcom,msm8996-bimc
|
||||
- qcom,msm8996-cnoc
|
||||
- qcom,msm8996-pnoc
|
||||
|
@ -186,6 +185,29 @@ allOf:
|
|||
required:
|
||||
- power-domains
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8996-a2noc
|
||||
|
||||
then:
|
||||
properties:
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
- const: bus_a
|
||||
- const: aggre2_ufs_axi
|
||||
- const: ufs_axi
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Bus Clock
|
||||
- description: Bus A Clock
|
||||
- description: Aggregate2 NoC UFS AXI Clock
|
||||
- description: UFS AXI Clock
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
#define PCI1760_CMD_CLR_IMB2 0x00 /* Clears IMB2 */
|
||||
#define PCI1760_CMD_SET_DO 0x01 /* Set output state */
|
||||
#define PCI1760_CMD_GET_DO 0x02 /* Read output status */
|
||||
#define PCI1760_CMD_GET_STATUS 0x03 /* Read current status */
|
||||
#define PCI1760_CMD_GET_STATUS 0x07 /* Read current status */
|
||||
#define PCI1760_CMD_GET_FW_VER 0x0e /* Read firmware version */
|
||||
#define PCI1760_CMD_GET_HW_VER 0x0f /* Read hardware version */
|
||||
#define PCI1760_CMD_SET_PWM_HI(x) (0x10 + (x) * 2) /* Set "hi" period */
|
||||
|
|
|
@ -361,9 +361,10 @@ static efi_status_t gsmi_get_variable(efi_char16_t *name,
|
|||
memcpy(data, gsmi_dev.data_buf->start, *data_size);
|
||||
|
||||
/* All variables are have the following attributes */
|
||||
*attr = EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS;
|
||||
if (attr)
|
||||
*attr = EFI_VARIABLE_NON_VOLATILE |
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&gsmi_dev.lock, flags);
|
||||
|
|
|
@ -488,7 +488,7 @@ int qnoc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
regmap_done:
|
||||
ret = devm_clk_bulk_get(dev, qp->num_clks, qp->bus_clks);
|
||||
ret = devm_clk_bulk_get_optional(dev, qp->num_clks, qp->bus_clks);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -33,6 +33,13 @@ static const char * const bus_a0noc_clocks[] = {
|
|||
"aggre0_noc_mpu_cfg"
|
||||
};
|
||||
|
||||
static const char * const bus_a2noc_clocks[] = {
|
||||
"bus",
|
||||
"bus_a",
|
||||
"aggre2_ufs_axi",
|
||||
"ufs_axi"
|
||||
};
|
||||
|
||||
static const u16 mas_a0noc_common_links[] = {
|
||||
MSM8996_SLAVE_A0NOC_SNOC
|
||||
};
|
||||
|
@ -1806,7 +1813,7 @@ static const struct regmap_config msm8996_a0noc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x9000,
|
||||
.max_register = 0x6000,
|
||||
.fast_io = true
|
||||
};
|
||||
|
||||
|
@ -1830,7 +1837,7 @@ static const struct regmap_config msm8996_a1noc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x7000,
|
||||
.max_register = 0x5000,
|
||||
.fast_io = true
|
||||
};
|
||||
|
||||
|
@ -1851,7 +1858,7 @@ static const struct regmap_config msm8996_a2noc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0xa000,
|
||||
.max_register = 0x7000,
|
||||
.fast_io = true
|
||||
};
|
||||
|
||||
|
@ -1859,6 +1866,8 @@ static const struct qcom_icc_desc msm8996_a2noc = {
|
|||
.type = QCOM_ICC_NOC,
|
||||
.nodes = a2noc_nodes,
|
||||
.num_nodes = ARRAY_SIZE(a2noc_nodes),
|
||||
.clocks = bus_a2noc_clocks,
|
||||
.num_clocks = ARRAY_SIZE(bus_a2noc_clocks),
|
||||
.regmap_cfg = &msm8996_a2noc_regmap_config
|
||||
};
|
||||
|
||||
|
@ -1877,7 +1886,7 @@ static const struct regmap_config msm8996_bimc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x62000,
|
||||
.max_register = 0x5a000,
|
||||
.fast_io = true
|
||||
};
|
||||
|
||||
|
@ -1988,7 +1997,7 @@ static const struct regmap_config msm8996_mnoc_regmap_config = {
|
|||
.reg_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.val_bits = 32,
|
||||
.max_register = 0x20000,
|
||||
.max_register = 0x1c000,
|
||||
.fast_io = true
|
||||
};
|
||||
|
||||
|
|
|
@ -321,7 +321,7 @@ static void fastrpc_free_map(struct kref *ref)
|
|||
perm.vmid = QCOM_SCM_VMID_HLOS;
|
||||
perm.perm = QCOM_SCM_PERM_RWX;
|
||||
err = qcom_scm_assign_mem(map->phys, map->size,
|
||||
&(map->fl->cctx->vmperms[0].vmid), &perm, 1);
|
||||
&map->fl->cctx->perms, &perm, 1);
|
||||
if (err) {
|
||||
dev_err(map->fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
|
||||
map->phys, map->size, err);
|
||||
|
@ -334,6 +334,13 @@ static void fastrpc_free_map(struct kref *ref)
|
|||
dma_buf_put(map->buf);
|
||||
}
|
||||
|
||||
if (map->fl) {
|
||||
spin_lock(&map->fl->lock);
|
||||
list_del(&map->node);
|
||||
spin_unlock(&map->fl->lock);
|
||||
map->fl = NULL;
|
||||
}
|
||||
|
||||
kfree(map);
|
||||
}
|
||||
|
||||
|
@ -343,38 +350,41 @@ static void fastrpc_map_put(struct fastrpc_map *map)
|
|||
kref_put(&map->refcount, fastrpc_free_map);
|
||||
}
|
||||
|
||||
static void fastrpc_map_get(struct fastrpc_map *map)
|
||||
static int fastrpc_map_get(struct fastrpc_map *map)
|
||||
{
|
||||
if (map)
|
||||
kref_get(&map->refcount);
|
||||
if (!map)
|
||||
return -ENOENT;
|
||||
|
||||
return kref_get_unless_zero(&map->refcount) ? 0 : -ENOENT;
|
||||
}
|
||||
|
||||
|
||||
static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
|
||||
struct fastrpc_map **ppmap)
|
||||
struct fastrpc_map **ppmap, bool take_ref)
|
||||
{
|
||||
struct fastrpc_session_ctx *sess = fl->sctx;
|
||||
struct fastrpc_map *map = NULL;
|
||||
int ret = -ENOENT;
|
||||
|
||||
mutex_lock(&fl->mutex);
|
||||
spin_lock(&fl->lock);
|
||||
list_for_each_entry(map, &fl->maps, node) {
|
||||
if (map->fd == fd) {
|
||||
*ppmap = map;
|
||||
mutex_unlock(&fl->mutex);
|
||||
return 0;
|
||||
if (map->fd != fd)
|
||||
continue;
|
||||
|
||||
if (take_ref) {
|
||||
ret = fastrpc_map_get(map);
|
||||
if (ret) {
|
||||
dev_dbg(sess->dev, "%s: Failed to get map fd=%d ret=%d\n",
|
||||
__func__, fd, ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*ppmap = map;
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&fl->mutex);
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
|
||||
struct fastrpc_map **ppmap)
|
||||
{
|
||||
int ret = fastrpc_map_lookup(fl, fd, ppmap);
|
||||
|
||||
if (!ret)
|
||||
fastrpc_map_get(*ppmap);
|
||||
spin_unlock(&fl->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -746,7 +756,7 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
|
|||
struct fastrpc_map *map = NULL;
|
||||
int err = 0;
|
||||
|
||||
if (!fastrpc_map_find(fl, fd, ppmap))
|
||||
if (!fastrpc_map_lookup(fl, fd, ppmap, true))
|
||||
return 0;
|
||||
|
||||
map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
|
@ -788,10 +798,8 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
|
|||
* If subsystem VMIDs are defined in DTSI, then do
|
||||
* hyp_assign from HLOS to those VM(s)
|
||||
*/
|
||||
unsigned int perms = BIT(QCOM_SCM_VMID_HLOS);
|
||||
|
||||
map->attr = attr;
|
||||
err = qcom_scm_assign_mem(map->phys, (u64)map->size, &perms,
|
||||
err = qcom_scm_assign_mem(map->phys, (u64)map->size, &fl->cctx->perms,
|
||||
fl->cctx->vmperms, fl->cctx->vmcount);
|
||||
if (err) {
|
||||
dev_err(sess->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
|
||||
|
@ -1070,7 +1078,7 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
|
|||
for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
|
||||
if (!fdlist[i])
|
||||
break;
|
||||
if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap))
|
||||
if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap, false))
|
||||
fastrpc_map_put(mmap);
|
||||
}
|
||||
|
||||
|
@ -1258,10 +1266,9 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
|
|||
|
||||
/* Map if we have any heap VMIDs associated with this ADSP Static Process. */
|
||||
if (fl->cctx->vmcount) {
|
||||
unsigned int perms = BIT(QCOM_SCM_VMID_HLOS);
|
||||
|
||||
err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
|
||||
(u64)fl->cctx->remote_heap->size, &perms,
|
||||
(u64)fl->cctx->remote_heap->size,
|
||||
&fl->cctx->perms,
|
||||
fl->cctx->vmperms, fl->cctx->vmcount);
|
||||
if (err) {
|
||||
dev_err(fl->sctx->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
|
||||
|
@ -1309,7 +1316,7 @@ err_invoke:
|
|||
perm.perm = QCOM_SCM_PERM_RWX;
|
||||
err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
|
||||
(u64)fl->cctx->remote_heap->size,
|
||||
&(fl->cctx->vmperms[0].vmid), &perm, 1);
|
||||
&fl->cctx->perms, &perm, 1);
|
||||
if (err)
|
||||
dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
|
||||
fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
|
||||
|
@ -1433,12 +1440,7 @@ err_invoke:
|
|||
fl->init_mem = NULL;
|
||||
fastrpc_buf_free(imem);
|
||||
err_alloc:
|
||||
if (map) {
|
||||
spin_lock(&fl->lock);
|
||||
list_del(&map->node);
|
||||
spin_unlock(&fl->lock);
|
||||
fastrpc_map_put(map);
|
||||
}
|
||||
fastrpc_map_put(map);
|
||||
err:
|
||||
kfree(args);
|
||||
|
||||
|
@ -1514,10 +1516,8 @@ static int fastrpc_device_release(struct inode *inode, struct file *file)
|
|||
fastrpc_context_put(ctx);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(map, m, &fl->maps, node) {
|
||||
list_del(&map->node);
|
||||
list_for_each_entry_safe(map, m, &fl->maps, node)
|
||||
fastrpc_map_put(map);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
|
||||
list_del(&buf->node);
|
||||
|
@ -1894,12 +1894,11 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
|
|||
/* Add memory to static PD pool, protection thru hypervisor */
|
||||
if (req.flags != ADSP_MMAP_REMOTE_HEAP_ADDR && fl->cctx->vmcount) {
|
||||
struct qcom_scm_vmperm perm;
|
||||
int err = 0;
|
||||
|
||||
perm.vmid = QCOM_SCM_VMID_HLOS;
|
||||
perm.perm = QCOM_SCM_PERM_RWX;
|
||||
err = qcom_scm_assign_mem(buf->phys, buf->size,
|
||||
&(fl->cctx->vmperms[0].vmid), &perm, 1);
|
||||
&fl->cctx->perms, &perm, 1);
|
||||
if (err) {
|
||||
dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
|
||||
buf->phys, buf->size, err);
|
||||
|
|
|
@ -702,13 +702,15 @@ void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)
|
|||
if (cl->state == MEI_FILE_UNINITIALIZED) {
|
||||
ret = mei_cl_link(cl);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto notlinked;
|
||||
/* update pointers */
|
||||
cl->cldev = cldev;
|
||||
}
|
||||
|
||||
ret = mei_cl_dma_alloc_and_map(cl, NULL, buffer_id, size);
|
||||
out:
|
||||
if (ret)
|
||||
mei_cl_unlink(cl);
|
||||
notlinked:
|
||||
mutex_unlock(&bus->device_lock);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
@ -758,7 +760,7 @@ int mei_cldev_enable(struct mei_cl_device *cldev)
|
|||
if (cl->state == MEI_FILE_UNINITIALIZED) {
|
||||
ret = mei_cl_link(cl);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto notlinked;
|
||||
/* update pointers */
|
||||
cl->cldev = cldev;
|
||||
}
|
||||
|
@ -785,6 +787,9 @@ int mei_cldev_enable(struct mei_cl_device *cldev)
|
|||
}
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
mei_cl_unlink(cl);
|
||||
notlinked:
|
||||
mutex_unlock(&bus->device_lock);
|
||||
|
||||
return ret;
|
||||
|
@ -1277,7 +1282,6 @@ static void mei_cl_bus_dev_release(struct device *dev)
|
|||
mei_cl_flush_queues(cldev->cl, NULL);
|
||||
mei_me_cl_put(cldev->me_cl);
|
||||
mei_dev_bus_put(cldev->bus);
|
||||
mei_cl_unlink(cldev->cl);
|
||||
kfree(cldev->cl);
|
||||
kfree(cldev);
|
||||
}
|
||||
|
|
|
@ -111,6 +111,8 @@
|
|||
|
||||
#define MEI_DEV_ID_RPL_S 0x7A68 /* Raptor Lake Point S */
|
||||
|
||||
#define MEI_DEV_ID_MTL_M 0x7E70 /* Meteor Lake Point M */
|
||||
|
||||
/*
|
||||
* MEI HW Section
|
||||
*/
|
||||
|
|
|
@ -118,6 +118,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = {
|
|||
|
||||
{MEI_PCI_DEVICE(MEI_DEV_ID_RPL_S, MEI_ME_PCH15_CFG)},
|
||||
|
||||
{MEI_PCI_DEVICE(MEI_DEV_ID_MTL_M, MEI_ME_PCH15_CFG)},
|
||||
|
||||
/* required last entry */
|
||||
{0, }
|
||||
};
|
||||
|
|
|
@ -56,8 +56,6 @@ struct vmci_guest_device {
|
|||
|
||||
bool exclusive_vectors;
|
||||
|
||||
struct tasklet_struct datagram_tasklet;
|
||||
struct tasklet_struct bm_tasklet;
|
||||
struct wait_queue_head inout_wq;
|
||||
|
||||
void *data_buffer;
|
||||
|
@ -304,9 +302,8 @@ static int vmci_check_host_caps(struct pci_dev *pdev)
|
|||
* This function assumes that it has exclusive access to the data
|
||||
* in register(s) for the duration of the call.
|
||||
*/
|
||||
static void vmci_dispatch_dgs(unsigned long data)
|
||||
static void vmci_dispatch_dgs(struct vmci_guest_device *vmci_dev)
|
||||
{
|
||||
struct vmci_guest_device *vmci_dev = (struct vmci_guest_device *)data;
|
||||
u8 *dg_in_buffer = vmci_dev->data_buffer;
|
||||
struct vmci_datagram *dg;
|
||||
size_t dg_in_buffer_size = VMCI_MAX_DG_SIZE;
|
||||
|
@ -465,10 +462,8 @@ static void vmci_dispatch_dgs(unsigned long data)
|
|||
* Scans the notification bitmap for raised flags, clears them
|
||||
* and handles the notifications.
|
||||
*/
|
||||
static void vmci_process_bitmap(unsigned long data)
|
||||
static void vmci_process_bitmap(struct vmci_guest_device *dev)
|
||||
{
|
||||
struct vmci_guest_device *dev = (struct vmci_guest_device *)data;
|
||||
|
||||
if (!dev->notification_bitmap) {
|
||||
dev_dbg(dev->dev, "No bitmap present in %s\n", __func__);
|
||||
return;
|
||||
|
@ -486,13 +481,13 @@ static irqreturn_t vmci_interrupt(int irq, void *_dev)
|
|||
struct vmci_guest_device *dev = _dev;
|
||||
|
||||
/*
|
||||
* If we are using MSI-X with exclusive vectors then we simply schedule
|
||||
* the datagram tasklet, since we know the interrupt was meant for us.
|
||||
* If we are using MSI-X with exclusive vectors then we simply call
|
||||
* vmci_dispatch_dgs(), since we know the interrupt was meant for us.
|
||||
* Otherwise we must read the ICR to determine what to do.
|
||||
*/
|
||||
|
||||
if (dev->exclusive_vectors) {
|
||||
tasklet_schedule(&dev->datagram_tasklet);
|
||||
vmci_dispatch_dgs(dev);
|
||||
} else {
|
||||
unsigned int icr;
|
||||
|
||||
|
@ -502,12 +497,12 @@ static irqreturn_t vmci_interrupt(int irq, void *_dev)
|
|||
return IRQ_NONE;
|
||||
|
||||
if (icr & VMCI_ICR_DATAGRAM) {
|
||||
tasklet_schedule(&dev->datagram_tasklet);
|
||||
vmci_dispatch_dgs(dev);
|
||||
icr &= ~VMCI_ICR_DATAGRAM;
|
||||
}
|
||||
|
||||
if (icr & VMCI_ICR_NOTIFICATION) {
|
||||
tasklet_schedule(&dev->bm_tasklet);
|
||||
vmci_process_bitmap(dev);
|
||||
icr &= ~VMCI_ICR_NOTIFICATION;
|
||||
}
|
||||
|
||||
|
@ -536,7 +531,7 @@ static irqreturn_t vmci_interrupt_bm(int irq, void *_dev)
|
|||
struct vmci_guest_device *dev = _dev;
|
||||
|
||||
/* For MSI-X we can just assume it was meant for us. */
|
||||
tasklet_schedule(&dev->bm_tasklet);
|
||||
vmci_process_bitmap(dev);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -638,10 +633,6 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
|
|||
vmci_dev->iobase = iobase;
|
||||
vmci_dev->mmio_base = mmio_base;
|
||||
|
||||
tasklet_init(&vmci_dev->datagram_tasklet,
|
||||
vmci_dispatch_dgs, (unsigned long)vmci_dev);
|
||||
tasklet_init(&vmci_dev->bm_tasklet,
|
||||
vmci_process_bitmap, (unsigned long)vmci_dev);
|
||||
init_waitqueue_head(&vmci_dev->inout_wq);
|
||||
|
||||
if (mmio_base != NULL) {
|
||||
|
@ -808,8 +799,9 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
|
|||
* Request IRQ for legacy or MSI interrupts, or for first
|
||||
* MSI-X vector.
|
||||
*/
|
||||
error = request_irq(pci_irq_vector(pdev, 0), vmci_interrupt,
|
||||
IRQF_SHARED, KBUILD_MODNAME, vmci_dev);
|
||||
error = request_threaded_irq(pci_irq_vector(pdev, 0), NULL,
|
||||
vmci_interrupt, IRQF_SHARED,
|
||||
KBUILD_MODNAME, vmci_dev);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev, "Irq %u in use: %d\n",
|
||||
pci_irq_vector(pdev, 0), error);
|
||||
|
@ -823,9 +815,9 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
|
|||
* between the vectors.
|
||||
*/
|
||||
if (vmci_dev->exclusive_vectors) {
|
||||
error = request_irq(pci_irq_vector(pdev, 1),
|
||||
vmci_interrupt_bm, 0, KBUILD_MODNAME,
|
||||
vmci_dev);
|
||||
error = request_threaded_irq(pci_irq_vector(pdev, 1), NULL,
|
||||
vmci_interrupt_bm, 0,
|
||||
KBUILD_MODNAME, vmci_dev);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to allocate irq %u: %d\n",
|
||||
|
@ -833,9 +825,11 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
|
|||
goto err_free_irq;
|
||||
}
|
||||
if (caps_in_use & VMCI_CAPS_DMA_DATAGRAM) {
|
||||
error = request_irq(pci_irq_vector(pdev, 2),
|
||||
vmci_interrupt_dma_datagram,
|
||||
0, KBUILD_MODNAME, vmci_dev);
|
||||
error = request_threaded_irq(pci_irq_vector(pdev, 2),
|
||||
NULL,
|
||||
vmci_interrupt_dma_datagram,
|
||||
0, KBUILD_MODNAME,
|
||||
vmci_dev);
|
||||
if (error) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to allocate irq %u: %d\n",
|
||||
|
@ -871,8 +865,6 @@ err_free_bm_irq:
|
|||
|
||||
err_free_irq:
|
||||
free_irq(pci_irq_vector(pdev, 0), vmci_dev);
|
||||
tasklet_kill(&vmci_dev->datagram_tasklet);
|
||||
tasklet_kill(&vmci_dev->bm_tasklet);
|
||||
|
||||
err_disable_msi:
|
||||
pci_free_irq_vectors(pdev);
|
||||
|
@ -943,9 +935,6 @@ static void vmci_guest_remove_device(struct pci_dev *pdev)
|
|||
free_irq(pci_irq_vector(pdev, 0), vmci_dev);
|
||||
pci_free_irq_vectors(pdev);
|
||||
|
||||
tasklet_kill(&vmci_dev->datagram_tasklet);
|
||||
tasklet_kill(&vmci_dev->bm_tasklet);
|
||||
|
||||
if (vmci_dev->notification_bitmap) {
|
||||
/*
|
||||
* The device reset above cleared the bitmap state of the
|
||||
|
|
|
@ -1166,6 +1166,8 @@ int w1_process(void *data)
|
|||
/* remainder if it woke up early */
|
||||
unsigned long jremain = 0;
|
||||
|
||||
atomic_inc(&dev->refcnt);
|
||||
|
||||
for (;;) {
|
||||
|
||||
if (!jremain && dev->search_count) {
|
||||
|
@ -1193,8 +1195,10 @@ int w1_process(void *data)
|
|||
*/
|
||||
mutex_unlock(&dev->list_mutex);
|
||||
|
||||
if (kthread_should_stop())
|
||||
if (kthread_should_stop()) {
|
||||
__set_current_state(TASK_RUNNING);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Only sleep when the search is active. */
|
||||
if (dev->search_count) {
|
||||
|
|
|
@ -51,10 +51,9 @@ static struct w1_master *w1_alloc_dev(u32 id, int slave_count, int slave_ttl,
|
|||
dev->search_count = w1_search_count;
|
||||
dev->enable_pullup = w1_enable_pullup;
|
||||
|
||||
/* 1 for w1_process to decrement
|
||||
* 1 for __w1_remove_master_device to decrement
|
||||
/* For __w1_remove_master_device to decrement
|
||||
*/
|
||||
atomic_set(&dev->refcnt, 2);
|
||||
atomic_set(&dev->refcnt, 1);
|
||||
|
||||
INIT_LIST_HEAD(&dev->slist);
|
||||
INIT_LIST_HEAD(&dev->async_list);
|
||||
|
|
Загрузка…
Ссылка в новой задаче