diff options
author | David Matlack <dmatlack@google.com> | 2015-05-11 20:40:36 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-05-13 16:13:24 -0700 |
commit | 36bf51acc89d113f101e40f40af4ab53fbf5b60a (patch) | |
tree | 42ad9e9ddb8fc97eef573884f636468340ad46ca /drivers/staging/slicoss | |
parent | eafe600205cb9299bf32a3117e03046f09a71190 (diff) | |
download | linux-36bf51acc89d113f101e40f40af4ab53fbf5b60a.tar.gz linux-36bf51acc89d113f101e40f40af4ab53fbf5b60a.tar.bz2 linux-36bf51acc89d113f101e40f40af4ab53fbf5b60a.zip |
staging: slicoss: fix occasionally writing out only half of a dma address
curaddrupper caches the last written upper 32-bits of a dma address
(the device has one register for the upper 32-bits of all dma
address registers). The problem is, not every dma address write
checks and sets curaddrupper. This causes the driver to occasionally
not write the upper 32-bits of a dma address to the device when it
really should.
I've seen this manifest particularly when the driver is trying to
read config data from the device (RCONFIG) in order to checksum the
device's eeprom. Since the device writes its config data to the
wrong DMA address the driver reads 0 as the eeprom size and the
eeprom checksum fails.
This patch fixes the issue by removing curaddrupper and always
writing the upper 32-bits of dma addresses.
Signed-off-by: David Matlack <dmatlack@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/slicoss')
-rw-r--r-- | drivers/staging/slicoss/slic.h | 1 | ||||
-rw-r--r-- | drivers/staging/slicoss/slicoss.c | 5 |
2 files changed, 1 insertions, 5 deletions
diff --git a/drivers/staging/slicoss/slic.h b/drivers/staging/slicoss/slic.h index 5b23254f811a..67a8c9eb2dca 100644 --- a/drivers/staging/slicoss/slic.h +++ b/drivers/staging/slicoss/slic.h @@ -414,7 +414,6 @@ struct adapter { u32 intrregistered; uint isp_initialized; uint gennumber; - u32 curaddrupper; struct slic_shmem *pshmem; dma_addr_t phys_shmem; u32 isrcopy; diff --git a/drivers/staging/slicoss/slicoss.c b/drivers/staging/slicoss/slicoss.c index 39c140ccdcbb..5f34ebbf7b31 100644 --- a/drivers/staging/slicoss/slicoss.c +++ b/drivers/staging/slicoss/slicoss.c @@ -147,10 +147,7 @@ static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg, unsigned long flags; spin_lock_irqsave(&adapter->bit64reglock, flags); - if (paddrh != adapter->curaddrupper) { - adapter->curaddrupper = paddrh; - writel(paddrh, regh); - } + writel(paddrh, regh); writel(value, reg); if (flush) mb(); |