aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vme/bridges
diff options
context:
space:
mode:
authorMartyn Welch <martyn.welch@ge.com>2013-06-11 06:20:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-06-17 19:41:50 -0400
commite31c51e4a1d11ed0b61557ca9da9cf18c8855531 (patch)
treeecad36019c26f0a3949232d4fbf03a67d8d41015 /drivers/vme/bridges
parentf3cbfa5d6e1bbd80b16ea337a2b00a89264c2b45 (diff)
vme: tsi148: Only store VME bus errors if they will be checked
The TSI148 driver provides an optional mechanism for ensuring that errors resulting from posted transfers are caught whilst still relevant. To do this errors are stored in a link list. If bus errors are not checked, this list would grow until available memory had been exhausted. Only store the errors in a link list if error detection is switched on. Reported-by: De Roo, Steven <steven.deroo@arcelormittal.com> Signed-off-by: Martyn Welch <martyn.welch@ge.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/vme/bridges')
-rw-r--r--drivers/vme/bridges/vme_tsi148.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/vme/bridges/vme_tsi148.c b/drivers/vme/bridges/vme_tsi148.c
index 9c1aa4dc39c9..94ce64d7a5f6 100644
--- a/drivers/vme/bridges/vme_tsi148.c
+++ b/drivers/vme/bridges/vme_tsi148.c
@@ -169,7 +169,7 @@ static u32 tsi148_VERR_irqhandler(struct vme_bridge *tsi148_bridge)
169 unsigned int error_addr_high, error_addr_low; 169 unsigned int error_addr_high, error_addr_low;
170 unsigned long long error_addr; 170 unsigned long long error_addr;
171 u32 error_attrib; 171 u32 error_attrib;
172 struct vme_bus_error *error; 172 struct vme_bus_error *error = NULL;
173 struct tsi148_driver *bridge; 173 struct tsi148_driver *bridge;
174 174
175 bridge = tsi148_bridge->driver_priv; 175 bridge = tsi148_bridge->driver_priv;
@@ -186,16 +186,22 @@ static u32 tsi148_VERR_irqhandler(struct vme_bridge *tsi148_bridge)
186 "Occurred\n"); 186 "Occurred\n");
187 } 187 }
188 188
189 error = kmalloc(sizeof(struct vme_bus_error), GFP_ATOMIC); 189 if (err_chk) {
190 if (error) { 190 error = kmalloc(sizeof(struct vme_bus_error), GFP_ATOMIC);
191 error->address = error_addr; 191 if (error) {
192 error->attributes = error_attrib; 192 error->address = error_addr;
193 list_add_tail(&error->list, &tsi148_bridge->vme_errors); 193 error->attributes = error_attrib;
194 } else { 194 list_add_tail(&error->list, &tsi148_bridge->vme_errors);
195 dev_err(tsi148_bridge->parent, "Unable to alloc memory for " 195 } else {
196 "VMEbus Error reporting\n"); 196 dev_err(tsi148_bridge->parent,
197 dev_err(tsi148_bridge->parent, "VME Bus Error at address: " 197 "Unable to alloc memory for VMEbus Error reporting\n");
198 "0x%llx, attributes: %08x\n", error_addr, error_attrib); 198 }
199 }
200
201 if (!error) {
202 dev_err(tsi148_bridge->parent,
203 "VME Bus Error at address: 0x%llx, attributes: %08x\n",
204 error_addr, error_attrib);
199 } 205 }
200 206
201 /* Clear Status */ 207 /* Clear Status */