Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4fb19d2 authored by Solomon Peachy's avatar Solomon Peachy Committed by John W. Linville
Browse files

Revert "cw1200: Don't perform SPI transfers in interrupt context"



This reverts commit aec8e88c.

This solution turned out to cause interrupt delivery problems, and
rather than trying to fix this approach, it has been scrapped in favor
of an alternative (and far simpler) implementation.

Signed-off-by: default avatarSolomon Peachy <pizza@shaftnet.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent b7be1522
Loading
Loading
Loading
Loading
+3 −16
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ struct hwbus_priv {
	spinlock_t		lock; /* Serialize all bus operations */
	wait_queue_head_t       wq;
	int claimed;
	int irq_disabled;
};

#define SDIO_TO_SPI_ADDR(addr) ((addr & 0x1f)>>2)
@@ -238,8 +237,6 @@ static irqreturn_t cw1200_spi_irq_handler(int irq, void *dev_id)
	struct hwbus_priv *self = dev_id;

	if (self->core) {
		disable_irq_nosync(self->func->irq);
		self->irq_disabled = 1;
		cw1200_irq_handler(self->core);
		return IRQ_HANDLED;
	} else {
@@ -273,22 +270,13 @@ exit:

static int cw1200_spi_irq_unsubscribe(struct hwbus_priv *self)
{
	int ret = 0;

	pr_debug("SW IRQ unsubscribe\n");
	disable_irq_wake(self->func->irq);
	free_irq(self->func->irq, self);

	return 0;
}

static int cw1200_spi_irq_enable(struct hwbus_priv *self, int enable)
{
	/* Disables are handled by the interrupt handler */
	if (enable && self->irq_disabled) {
		enable_irq(self->func->irq);
		self->irq_disabled = 0;
	}

	return 0;
	return ret;
}

static int cw1200_spi_off(const struct cw1200_platform_data_spi *pdata)
@@ -368,7 +356,6 @@ static struct hwbus_ops cw1200_spi_hwbus_ops = {
	.unlock			= cw1200_spi_unlock,
	.align_size		= cw1200_spi_align_size,
	.power_mgmt		= cw1200_spi_pm,
	.irq_enable             = cw1200_spi_irq_enable,
};

/* Probe Function to be called by SPI stack when device is discovered */
+1 −1
Original line number Diff line number Diff line
@@ -485,7 +485,7 @@ int cw1200_load_firmware(struct cw1200_common *priv)

	/* Enable interrupt signalling */
	priv->hwbus_ops->lock(priv->hwbus_priv);
	ret = __cw1200_irq_enable(priv, 2);
	ret = __cw1200_irq_enable(priv, 1);
	priv->hwbus_ops->unlock(priv->hwbus_priv);
	if (ret < 0)
		goto unsubscribe;
+0 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ struct hwbus_ops {
	void (*unlock)(struct hwbus_priv *self);
	size_t (*align_size)(struct hwbus_priv *self, size_t size);
	int (*power_mgmt)(struct hwbus_priv *self, bool suspend);
	int (*irq_enable)(struct hwbus_priv *self, int enable);
};

#endif /* CW1200_HWBUS_H */
+0 −15
Original line number Diff line number Diff line
@@ -273,21 +273,6 @@ int __cw1200_irq_enable(struct cw1200_common *priv, int enable)
	u16 val16;
	int ret;

	/* We need to do this hack because the SPI layer can sleep on I/O
	   and the general path involves I/O to the device in interrupt
	   context.

	   However, the initial enable call needs to go to the hardware.

	   We don't worry about shutdown because we do a full reset which
	   clears the interrupt enabled bits.
	*/
	if (priv->hwbus_ops->irq_enable) {
		ret = priv->hwbus_ops->irq_enable(priv->hwbus_priv, enable);
		if (ret || enable < 2)
			return ret;
	}

	if (HIF_8601_SILICON == priv->hw_type) {
		ret = __cw1200_reg_read_32(priv, ST90TDS_CONFIG_REG_ID, &val32);
		if (ret < 0) {