aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartyn Welch <martyn.welch@ge.com>2010-02-18 10:13:32 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-03 19:43:01 -0500
commit21e0cf6d2e59e19f77096e73d83157734e7f7782 (patch)
tree6274c863c787efa6f4f47e6a64374a67a3740689
parent4860ab74d4d577d21fbfe0da3bd0925f3efc8907 (diff)
Staging: vme: Correct ca91cx42 resource handling
The ca91cx42 driver currently incorrectly handles master windows, setting and retrieving the sizing parameters incorrectly. Also, in the slave window handling, it uses an incorrectly set variable. Signed-off-by: Martyn Welch <martyn.welch@ge.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/vme/bridges/vme_ca91cx42.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/staging/vme/bridges/vme_ca91cx42.c b/drivers/staging/vme/bridges/vme_ca91cx42.c
index eddf071df40f..0348cc847302 100644
--- a/drivers/staging/vme/bridges/vme_ca91cx42.c
+++ b/drivers/staging/vme/bridges/vme_ca91cx42.c
@@ -337,7 +337,7 @@ int ca91cx42_slave_set(struct vme_slave_resource *image, int enabled,
337 unsigned long long vme_base, unsigned long long size, 337 unsigned long long vme_base, unsigned long long size,
338 dma_addr_t pci_base, vme_address_t aspace, vme_cycle_t cycle) 338 dma_addr_t pci_base, vme_address_t aspace, vme_cycle_t cycle)
339{ 339{
340 unsigned int i, addr = 0, granularity = 0; 340 unsigned int i, addr = 0, granularity;
341 unsigned int temp_ctl = 0; 341 unsigned int temp_ctl = 0;
342 unsigned int vme_bound, pci_offset; 342 unsigned int vme_bound, pci_offset;
343 struct ca91cx42_driver *bridge; 343 struct ca91cx42_driver *bridge;
@@ -376,7 +376,7 @@ int ca91cx42_slave_set(struct vme_slave_resource *image, int enabled,
376 * Bound address is a valid address for the window, adjust 376 * Bound address is a valid address for the window, adjust
377 * accordingly 377 * accordingly
378 */ 378 */
379 vme_bound = vme_base + size - granularity; 379 vme_bound = vme_base + size;
380 pci_offset = pci_base - vme_base; 380 pci_offset = pci_base - vme_base;
381 381
382 /* XXX Need to check that vme_base, vme_bound and pci_offset aren't 382 /* XXX Need to check that vme_base, vme_bound and pci_offset aren't
@@ -609,20 +609,27 @@ int ca91cx42_master_set(struct vme_master_resource *image, int enabled,
609 vme_address_t aspace, vme_cycle_t cycle, vme_width_t dwidth) 609 vme_address_t aspace, vme_cycle_t cycle, vme_width_t dwidth)
610{ 610{
611 int retval = 0; 611 int retval = 0;
612 unsigned int i; 612 unsigned int i, granularity = 0;
613 unsigned int temp_ctl = 0; 613 unsigned int temp_ctl = 0;
614 unsigned long long pci_bound, vme_offset, pci_base; 614 unsigned long long pci_bound, vme_offset, pci_base;
615 struct ca91cx42_driver *bridge; 615 struct ca91cx42_driver *bridge;
616 616
617 bridge = image->parent->driver_priv; 617 bridge = image->parent->driver_priv;
618 618
619 i = image->number;
620
621 if ((i == 0) || (i == 4))
622 granularity = 0x1000;
623 else
624 granularity = 0x10000;
625
619 /* Verify input data */ 626 /* Verify input data */
620 if (vme_base & 0xFFF) { 627 if (vme_base & (granularity - 1)) {
621 printk(KERN_ERR "Invalid VME Window alignment\n"); 628 printk(KERN_ERR "Invalid VME Window alignment\n");
622 retval = -EINVAL; 629 retval = -EINVAL;
623 goto err_window; 630 goto err_window;
624 } 631 }
625 if (size & 0xFFF) { 632 if (size & (granularity - 1)) {
626 printk(KERN_ERR "Invalid VME Window alignment\n"); 633 printk(KERN_ERR "Invalid VME Window alignment\n");
627 retval = -EINVAL; 634 retval = -EINVAL;
628 goto err_window; 635 goto err_window;
@@ -652,11 +659,9 @@ int ca91cx42_master_set(struct vme_master_resource *image, int enabled,
652 * Bound address is a valid address for the window, adjust 659 * Bound address is a valid address for the window, adjust
653 * according to window granularity. 660 * according to window granularity.
654 */ 661 */
655 pci_bound = pci_base + (size - 0x1000); 662 pci_bound = pci_base + size;
656 vme_offset = vme_base - pci_base; 663 vme_offset = vme_base - pci_base;
657 664
658 i = image->number;
659
660 /* Disable while we are mucking around */ 665 /* Disable while we are mucking around */
661 temp_ctl = ioread32(bridge->base + CA91CX42_LSI_CTL[i]); 666 temp_ctl = ioread32(bridge->base + CA91CX42_LSI_CTL[i]);
662 temp_ctl &= ~CA91CX42_LSI_CTL_EN; 667 temp_ctl &= ~CA91CX42_LSI_CTL_EN;
@@ -779,7 +784,7 @@ int __ca91cx42_master_get(struct vme_master_resource *image, int *enabled,
779 pci_bound = ioread32(bridge->base + CA91CX42_LSI_BD[i]); 784 pci_bound = ioread32(bridge->base + CA91CX42_LSI_BD[i]);
780 785
781 *vme_base = pci_base + vme_offset; 786 *vme_base = pci_base + vme_offset;
782 *size = (pci_bound - pci_base) + 0x1000; 787 *size = (unsigned long long)(pci_bound - pci_base);
783 788
784 *enabled = 0; 789 *enabled = 0;
785 *aspace = 0; 790 *aspace = 0;
@@ -872,7 +877,7 @@ int ca91cx42_master_get(struct vme_master_resource *image, int *enabled,
872ssize_t ca91cx42_master_read(struct vme_master_resource *image, void *buf, 877ssize_t ca91cx42_master_read(struct vme_master_resource *image, void *buf,
873 size_t count, loff_t offset) 878 size_t count, loff_t offset)
874{ 879{
875 int retval; 880 ssize_t retval;
876 881
877 spin_lock(&(image->lock)); 882 spin_lock(&(image->lock));
878 883