diff options
Diffstat (limited to 'arch/ia64/sn/pci/pcibr/pcibr_ate.c')
| -rw-r--r-- | arch/ia64/sn/pci/pcibr/pcibr_ate.c | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/arch/ia64/sn/pci/pcibr/pcibr_ate.c b/arch/ia64/sn/pci/pcibr/pcibr_ate.c index aa3fa5152a32..1f0253bfe0a0 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_ate.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_ate.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2001-2004 Silicon Graphics, Inc. All rights reserved. | 6 | * Copyright (C) 2001-2006 Silicon Graphics, Inc. All rights reserved. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
| @@ -12,7 +12,7 @@ | |||
| 12 | #include <asm/sn/pcibus_provider_defs.h> | 12 | #include <asm/sn/pcibus_provider_defs.h> |
| 13 | #include <asm/sn/pcidev.h> | 13 | #include <asm/sn/pcidev.h> |
| 14 | 14 | ||
| 15 | int pcibr_invalidate_ate = 0; /* by default don't invalidate ATE on free */ | 15 | int pcibr_invalidate_ate; /* by default don't invalidate ATE on free */ |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | * mark_ate: Mark the ate as either free or inuse. | 18 | * mark_ate: Mark the ate as either free or inuse. |
| @@ -20,14 +20,12 @@ int pcibr_invalidate_ate = 0; /* by default don't invalidate ATE on free */ | |||
| 20 | static void mark_ate(struct ate_resource *ate_resource, int start, int number, | 20 | static void mark_ate(struct ate_resource *ate_resource, int start, int number, |
| 21 | u64 value) | 21 | u64 value) |
| 22 | { | 22 | { |
| 23 | |||
| 24 | u64 *ate = ate_resource->ate; | 23 | u64 *ate = ate_resource->ate; |
| 25 | int index; | 24 | int index; |
| 26 | int length = 0; | 25 | int length = 0; |
| 27 | 26 | ||
| 28 | for (index = start; length < number; index++, length++) | 27 | for (index = start; length < number; index++, length++) |
| 29 | ate[index] = value; | 28 | ate[index] = value; |
| 30 | |||
| 31 | } | 29 | } |
| 32 | 30 | ||
| 33 | /* | 31 | /* |
| @@ -37,7 +35,6 @@ static void mark_ate(struct ate_resource *ate_resource, int start, int number, | |||
| 37 | static int find_free_ate(struct ate_resource *ate_resource, int start, | 35 | static int find_free_ate(struct ate_resource *ate_resource, int start, |
| 38 | int count) | 36 | int count) |
| 39 | { | 37 | { |
| 40 | |||
| 41 | u64 *ate = ate_resource->ate; | 38 | u64 *ate = ate_resource->ate; |
| 42 | int index; | 39 | int index; |
| 43 | int start_free; | 40 | int start_free; |
| @@ -70,12 +67,10 @@ static int find_free_ate(struct ate_resource *ate_resource, int start, | |||
| 70 | static inline void free_ate_resource(struct ate_resource *ate_resource, | 67 | static inline void free_ate_resource(struct ate_resource *ate_resource, |
| 71 | int start) | 68 | int start) |
| 72 | { | 69 | { |
| 73 | |||
| 74 | mark_ate(ate_resource, start, ate_resource->ate[start], 0); | 70 | mark_ate(ate_resource, start, ate_resource->ate[start], 0); |
| 75 | if ((ate_resource->lowest_free_index > start) || | 71 | if ((ate_resource->lowest_free_index > start) || |
| 76 | (ate_resource->lowest_free_index < 0)) | 72 | (ate_resource->lowest_free_index < 0)) |
| 77 | ate_resource->lowest_free_index = start; | 73 | ate_resource->lowest_free_index = start; |
| 78 | |||
| 79 | } | 74 | } |
| 80 | 75 | ||
| 81 | /* | 76 | /* |
| @@ -84,7 +79,6 @@ static inline void free_ate_resource(struct ate_resource *ate_resource, | |||
| 84 | static inline int alloc_ate_resource(struct ate_resource *ate_resource, | 79 | static inline int alloc_ate_resource(struct ate_resource *ate_resource, |
| 85 | int ate_needed) | 80 | int ate_needed) |
| 86 | { | 81 | { |
| 87 | |||
| 88 | int start_index; | 82 | int start_index; |
| 89 | 83 | ||
| 90 | /* | 84 | /* |
| @@ -118,19 +112,12 @@ static inline int alloc_ate_resource(struct ate_resource *ate_resource, | |||
| 118 | */ | 112 | */ |
| 119 | int pcibr_ate_alloc(struct pcibus_info *pcibus_info, int count) | 113 | int pcibr_ate_alloc(struct pcibus_info *pcibus_info, int count) |
| 120 | { | 114 | { |
| 121 | int status = 0; | 115 | int status; |
| 122 | u64 flag; | 116 | unsigned long flags; |
| 123 | 117 | ||
| 124 | flag = pcibr_lock(pcibus_info); | 118 | spin_lock_irqsave(&pcibus_info->pbi_lock, flags); |
| 125 | status = alloc_ate_resource(&pcibus_info->pbi_int_ate_resource, count); | 119 | status = alloc_ate_resource(&pcibus_info->pbi_int_ate_resource, count); |
| 126 | 120 | spin_unlock_irqrestore(&pcibus_info->pbi_lock, flags); | |
| 127 | if (status < 0) { | ||
| 128 | /* Failed to allocate */ | ||
| 129 | pcibr_unlock(pcibus_info, flag); | ||
| 130 | return -1; | ||
| 131 | } | ||
| 132 | |||
| 133 | pcibr_unlock(pcibus_info, flag); | ||
| 134 | 121 | ||
| 135 | return status; | 122 | return status; |
| 136 | } | 123 | } |
| @@ -182,7 +169,7 @@ void pcibr_ate_free(struct pcibus_info *pcibus_info, int index) | |||
| 182 | ate_write(pcibus_info, index, count, (ate & ~PCI32_ATE_V)); | 169 | ate_write(pcibus_info, index, count, (ate & ~PCI32_ATE_V)); |
| 183 | } | 170 | } |
| 184 | 171 | ||
| 185 | flags = pcibr_lock(pcibus_info); | 172 | spin_lock_irqsave(&pcibus_info->pbi_lock, flags); |
| 186 | free_ate_resource(&pcibus_info->pbi_int_ate_resource, index); | 173 | free_ate_resource(&pcibus_info->pbi_int_ate_resource, index); |
| 187 | pcibr_unlock(pcibus_info, flags); | 174 | spin_unlock_irqrestore(&pcibus_info->pbi_lock, flags); |
| 188 | } | 175 | } |
