From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org, jejb@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
Zwane Mwaikambo <zwane@arm.linux.org.uk>,
"Theodore Ts'o" <tytso@mit.edu>,
Randy Dunlap <rdunlap@xenotime.net>,
Dave Jones <davej@redhat.com>,
Chuck Wolber <chuckw@quantumlinux.com>,
Chris Wedgwood <reviews@ml.cw.f00f.org>,
Michael Krufky <mkrufky@linuxtv.org>,
Chuck Ebbert <cebbert@redhat.com>,
Domenico Andreoli <cavokz@gmail.com>, Willy Tarreau <w@1wt.eu>,
Rodrigo Rubira Branco <rbranco@la.checkpoint.com>,
Jake Edge <jake@lwn.net>, Eugene Teo <eteo@redhat.com>,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
alan@lxorguk.ukuu.org.uk, Ned Forrester <nforrester@whoi.edu>,
Vernon Sauder <vernoninhand@gmail.com>,
Eric Miao <eric.y.miao@gmail.com>,
David Brownell <dbrownell@users.sourceforge.net>
Subject: [patch 09/71] pxa2xx_spi: chipselect bugfixes
Date: Mon, 6 Oct 2008 17:37:46 -0700 [thread overview]
Message-ID: <20081007003746.GJ3055@suse.de> (raw)
In-Reply-To: <20081007003634.GA3055@suse.de>
[-- Attachment #1: pxa2xx_spi-chipselect-bugfixes.patch --]
[-- Type: text/plain, Size: 5814 bytes --]
2.6.26-stable review patch. If anyone has any objections, please let us
know.
------------------
From: Ned Forrester <nforrester@whoi.edu>
commit 8423597d676615f3dd2d9ab36f59f147086b90b8 upstream
Fixes several chipselect bugs in the pxa2xx_spi driver. These bugs are in
all versions of this driver and prevent using it with chips like m25p16
flash.
1. The spi_transfer.cs_change flag is handled too early:
before spi_transfer.delay_usecs applies, thus making the
delay ineffective at holding chip select.
2. spi_transfer.delay_usecs is ignored on the last transfer
of a message (likewise not holding chipselect long enough).
3. If spi_transfer.cs_change is set on the last transfer, the
chip select is always disabled, instead of the intended
meaning: optionally holding chip select enabled for the
next message.
Those first three bugs were fixed with a relocation of delays
and chip select de-assertions.
4. If a message has the cs_change flag set on the last transfer,
and had the chip select stayed enabled as requested (see 3,
above), it would not have been disabled if the next message is
for a different chip. Fixed by dropping chip select regardless
of cs_change at end of a message, if there is no next message
or if the next message is for a different chip.
This patch should apply to all kernels back to and including 2.6.20;
it was test patched against 2.6.20. An additional patch would be
required for older kernels, but those versions are very buggy anyway.
Signed-off-by: Ned Forrester <nforrester@whoi.edu>
Cc: Vernon Sauder <vernoninhand@gmail.com>
Cc: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/spi/pxa2xx_spi.c | 59 ++++++++++++++++++++++++++++++++++++++---------
1 file changed, 48 insertions(+), 11 deletions(-)
--- a/drivers/spi/pxa2xx_spi.c
+++ b/drivers/spi/pxa2xx_spi.c
@@ -146,7 +146,6 @@ struct driver_data {
size_t tx_map_len;
u8 n_bytes;
u32 dma_width;
- int cs_change;
int (*write)(struct driver_data *drv_data);
int (*read)(struct driver_data *drv_data);
irqreturn_t (*transfer_handler)(struct driver_data *drv_data);
@@ -408,8 +407,45 @@ static void giveback(struct driver_data
struct spi_transfer,
transfer_list);
+ /* Delay if requested before any change in chip select */
+ if (last_transfer->delay_usecs)
+ udelay(last_transfer->delay_usecs);
+
+ /* Drop chip select UNLESS cs_change is true or we are returning
+ * a message with an error, or next message is for another chip
+ */
if (!last_transfer->cs_change)
drv_data->cs_control(PXA2XX_CS_DEASSERT);
+ else {
+ struct spi_message *next_msg;
+
+ /* Holding of cs was hinted, but we need to make sure
+ * the next message is for the same chip. Don't waste
+ * time with the following tests unless this was hinted.
+ *
+ * We cannot postpone this until pump_messages, because
+ * after calling msg->complete (below) the driver that
+ * sent the current message could be unloaded, which
+ * could invalidate the cs_control() callback...
+ */
+
+ /* get a pointer to the next message, if any */
+ spin_lock_irqsave(&drv_data->lock, flags);
+ if (list_empty(&drv_data->queue))
+ next_msg = NULL;
+ else
+ next_msg = list_entry(drv_data->queue.next,
+ struct spi_message, queue);
+ spin_unlock_irqrestore(&drv_data->lock, flags);
+
+ /* see if the next and current messages point
+ * to the same chip
+ */
+ if (next_msg && next_msg->spi != msg->spi)
+ next_msg = NULL;
+ if (!next_msg || msg->state == ERROR_STATE)
+ drv_data->cs_control(PXA2XX_CS_DEASSERT);
+ }
msg->state = NULL;
if (msg->complete)
@@ -492,10 +528,9 @@ static void dma_transfer_complete(struct
msg->actual_length += drv_data->len -
(drv_data->rx_end - drv_data->rx);
- /* Release chip select if requested, transfer delays are
- * handled in pump_transfers */
- if (drv_data->cs_change)
- drv_data->cs_control(PXA2XX_CS_DEASSERT);
+ /* Transfer delays and chip select release are
+ * handled in pump_transfers or giveback
+ */
/* Move to next transfer */
msg->state = next_transfer(drv_data);
@@ -604,10 +639,9 @@ static void int_transfer_complete(struct
drv_data->cur_msg->actual_length += drv_data->len -
(drv_data->rx_end - drv_data->rx);
- /* Release chip select if requested, transfer delays are
- * handled in pump_transfers */
- if (drv_data->cs_change)
- drv_data->cs_control(PXA2XX_CS_DEASSERT);
+ /* Transfer delays and chip select release are
+ * handled in pump_transfers or giveback
+ */
/* Move to next transfer */
drv_data->cur_msg->state = next_transfer(drv_data);
@@ -842,13 +876,17 @@ static void pump_transfers(unsigned long
return;
}
- /* Delay if requested at end of transfer*/
+ /* Delay if requested at end of transfer before CS change */
if (message->state == RUNNING_STATE) {
previous = list_entry(transfer->transfer_list.prev,
struct spi_transfer,
transfer_list);
if (previous->delay_usecs)
udelay(previous->delay_usecs);
+
+ /* Drop chip select only if cs_change is requested */
+ if (previous->cs_change)
+ drv_data->cs_control(PXA2XX_CS_DEASSERT);
}
/* Check for transfers that need multiple DMA segments */
@@ -893,7 +931,6 @@ static void pump_transfers(unsigned long
drv_data->len = transfer->len & DCMD_LENGTH;
drv_data->write = drv_data->tx ? chip->write : null_writer;
drv_data->read = drv_data->rx ? chip->read : null_reader;
- drv_data->cs_change = transfer->cs_change;
/* Change speed and bit per word on a per transfer */
cr0 = chip->cr0;
--
next prev parent reply other threads:[~2008-10-07 0:43 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20081007002606.723632097@mini.kroah.org>
2008-10-07 0:36 ` [patch 00/71] 2.6.26-stable review Greg KH
2008-10-07 0:37 ` [patch 01/71] x86-32: AMD c1e force timer broadcast late Greg KH
2008-10-07 0:37 ` [patch 02/71] ACPI: Fix thermal shutdowns Greg KH
2008-10-07 0:37 ` [patch 03/71] i2c-dev: Return correct error code on class_create() failure Greg KH
2008-10-07 0:37 ` [patch 04/71] ixgbe: initialize interrupt throttle rate Greg KH
2008-10-07 0:37 ` [patch 05/71] drivers/mmc/card/block.c: fix refcount leak in mmc_block_open() Greg KH
2008-10-07 0:37 ` [patch 06/71] async_tx: fix the bug in async_tx_run_dependencies Greg KH
2008-10-07 0:37 ` [patch 07/71] mm: mark the correct zone as full when scanning zonelists Greg KH
2008-10-07 0:37 ` [patch 08/71] pxa2xx_spi: dma bugfixes Greg KH
2008-10-07 0:37 ` Greg KH [this message]
2008-10-07 0:37 ` [patch 10/71] smb.h: do not include linux/time.h in userspace Greg KH
2008-10-07 0:37 ` [patch 11/71] USB: fix hcd interrupt disabling Greg KH
2008-10-07 0:37 ` [patch 12/71] SCSI: qla2xxx: Defer enablement of RISC interrupts until ISP initialization completes Greg KH
2008-10-07 0:38 ` [patch 13/71] ALSA: hda - Fix model for Dell Inspiron 1525 Greg KH
2008-10-07 0:38 ` [patch 14/71] ALSA: oxygen: fix distorted output on AK4396-based cards Greg KH
2008-10-07 0:38 ` [patch 15/71] ALSA: fix locking in snd_pcm_open*() and snd_rawmidi_open*() Greg KH
2008-10-07 0:38 ` [patch 16/71] ALSA: remove unneeded power_mutex lock in snd_pcm_drop Greg KH
2008-10-07 0:38 ` [patch 17/71] KVM: SVM: fix random segfaults with NPT enabled Greg KH
2008-10-07 0:38 ` [patch 18/71] KVM: SVM: fix guest global tlb flushes with NPT Greg KH
2008-10-07 0:38 ` [patch 19/71] x86-64: Clean up save/restore_i387() usage Greg KH
2008-10-07 0:38 ` [patch 20/71] x64, fpu: fix possible FPU leakage in error conditions Greg KH
2008-10-07 0:38 ` [patch 21/71] x86: Fix broken LDT access in VMI Greg KH
2008-10-07 0:38 ` [patch 22/71] block: submit_bh() inadvertently discards barrier flag on a sync write Greg KH
2008-10-07 0:38 ` [patch 23/71] sched: fix process time monotonicity Greg KH
2008-10-07 0:38 ` [patch 24/71] APIC routing fix Greg KH
2008-10-07 0:38 ` [patch 25/71] ocfs2: Increment the reference count of an already-active stack Greg KH
2008-10-07 0:38 ` [patch 26/71] sg: disable interrupts inside sg_copy_buffer Greg KH
2008-10-07 0:38 ` [patch 27/71] x86: Fix 27-rc crash on vsmp due to paravirt during module load Greg KH
2008-10-07 0:38 ` [patch 28/71] rt2x00: Use ieee80211_hw->workqueue again Greg KH
2008-10-07 0:38 ` [patch 29/71] x86: fdiv bug detection fix Greg KH
2008-10-07 0:38 ` [patch 30/71] x86: fix oprofile + hibernation badness Greg KH
2008-10-07 0:38 ` [patch 31/71] x86: PAT proper tracking of set_memory_uc and friends Greg KH
2008-10-07 0:38 ` [patch 32/71] x86-64: fix overlap of modules and fixmap areas Greg KH
2008-10-07 0:38 ` [patch 33/71] mm: dirty page tracking race fix Greg KH
2008-10-07 0:38 ` [patch 34/71] rtc: fix deadlock Greg KH
2008-10-07 0:38 ` [patch 35/71] x86: fix SMP alternatives: use mutex instead of spinlock, text_poke is sleepable Greg KH
2008-10-07 0:38 ` [patch 36/71] ACPI: Avoid bogus EC timeout when EC is in Polling mode Greg KH
2008-10-07 0:39 ` [patch 37/71] x86: add io delay quirk for Presario F700 Greg KH
2008-10-07 0:39 ` [patch 38/71] x86: fix memmap=exactmap boot argument Greg KH
2008-10-07 0:39 ` [patch 39/71] clockevents: prevent clockevent event_handler ending up handler_noop Greg KH
2008-10-07 0:39 ` [patch 40/71] clockevents: prevent endless loop in periodic broadcast handler Greg KH
2008-10-07 0:39 ` [patch 41/71] clockevents: enforce reprogram in oneshot setup Greg KH
2008-10-07 0:39 ` [patch 42/71] clockevents: prevent multiple init/shutdown Greg KH
2008-10-07 0:39 ` [patch 43/71] clockevents: prevent endless loop lockup Greg KH
2008-10-07 0:39 ` [patch 44/71] HPET: make minimum reprogramming delta useful Greg KH
2008-10-07 0:39 ` [patch 45/71] clockevents: broadcast fixup possible waiters Greg KH
2008-10-07 0:39 ` [patch 46/71] x86: HPET fix moronic 32/64bit thinko Greg KH
2008-10-07 0:39 ` [patch 47/71] x86: HPET: read back compare register before reading counter Greg KH
2008-10-07 0:39 ` [patch 48/71] ntp: fix calculation of the next jiffie to trigger RTC sync Greg KH
2008-10-07 0:39 ` [patch 49/71] clockevents: remove WARN_ON which was used to gather information Greg KH
2008-10-07 0:39 ` [patch 50/71] pcmcia: Fix broken abuse of dev->driver_data Greg KH
2008-10-07 0:39 ` [patch 51/71] af_key: Free dumping state on socket close Greg KH
2008-10-07 0:39 ` [patch 52/71] XFRM,IPv6: initialize ip6_dst_blackhole_ops.kmem_cachep Greg KH
2008-10-07 0:39 ` [patch 53/71] ipv6: Fix OOPS in ip6_dst_lookup_tail() Greg KH
2008-10-07 0:39 ` [patch 54/71] niu: panic on reset Greg KH
2008-10-07 0:39 ` [patch 55/71] netlink: fix overrun in attribute iteration Greg KH
2008-10-07 0:39 ` [patch 56/71] ipsec: Fix pskb_expand_head corruption in xfrm_state_check_space Greg KH
2008-10-07 0:40 ` [patch 57/71] sctp: do not enable peer features if we cant do them Greg KH
2008-10-07 0:40 ` [patch 58/71] sctp: Fix oops when INIT-ACK indicates that peer doesnt support AUTH Greg KH
2008-10-07 0:40 ` [patch 59/71] udp: Fix rcv socket locking Greg KH
2008-10-07 0:40 ` [patch 60/71] sparc64: Fix PCI error interrupt registry on PSYCHO Greg KH
2008-12-29 17:14 ` [patch 60/71] sparc64: Fix PCI error interrupt registry on Geert Uytterhoeven
2008-12-29 17:14 ` [patch 60/71] sparc64: Fix PCI error interrupt registry on PSYCHO Geert Uytterhoeven
2008-12-30 2:36 ` [patch 60/71] sparc64: Fix PCI error interrupt registry on David Miller
2008-12-30 2:36 ` [patch 60/71] sparc64: Fix PCI error interrupt registry on PSYCHO David Miller
2008-10-07 0:40 ` [patch 61/71] sparc64: Fix interrupt register calculations on Psycho and Sabre Greg KH
2008-10-07 0:40 ` [patch 62/71] sparc64: Fix OOPS in psycho_pcierr_intr_other() Greg KH
2008-10-07 0:40 ` [patch 63/71] sparc64: Fix disappearing PCI devices on e3500 Greg KH
2008-10-07 0:40 ` [patch 64/71] sparc64: Fix missing devices due to PCI bridge test in of_create_pci_dev() Greg KH
2008-10-07 0:40 ` [patch 65/71] braille_console: only register notifiers when the braille console is used Greg KH
2008-10-07 0:40 ` [patch 66/71] ALSA: snd-powermac: mixers for PowerMac G4 AGP Greg KH
2008-10-07 0:40 ` [patch 67/71] ALSA: snd-powermac: HP detection for 1st iMac G3 SL Greg KH
2008-10-07 0:40 ` [patch 68/71] fbcon: fix monochrome color value calculation Greg KH
2008-10-07 0:40 ` [patch 69/71] rtc: fix kernel panic on second use of SIGIO nofitication Greg KH
2008-10-07 0:40 ` [patch 70/71] mm owner: fix race between swapoff and exit Greg KH
2008-10-07 0:40 ` [patch 71/71] S390: CVE-2008-1514: prevent ptrace padding area read/write in 31-bit mode Greg KH
2008-10-07 4:42 ` [patch 00/71] 2.6.26-stable review Grant Coady
2008-10-07 4:59 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081007003746.GJ3055@suse.de \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=cavokz@gmail.com \
--cc=cebbert@redhat.com \
--cc=chuckw@quantumlinux.com \
--cc=davej@redhat.com \
--cc=dbrownell@users.sourceforge.net \
--cc=eric.y.miao@gmail.com \
--cc=eteo@redhat.com \
--cc=jake@lwn.net \
--cc=jejb@kernel.org \
--cc=jmforbes@linuxtx.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mkrufky@linuxtv.org \
--cc=nforrester@whoi.edu \
--cc=rbranco@la.checkpoint.com \
--cc=rdunlap@xenotime.net \
--cc=reviews@ml.cw.f00f.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
--cc=vernoninhand@gmail.com \
--cc=w@1wt.eu \
--cc=zwane@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.