aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bcma
diff options
context:
space:
mode:
authorNathan Hintz <nlhintz@hotmail.com>2013-01-12 05:46:15 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-01-14 15:10:41 -0500
commit447d7e25be462329268f279bef2f6faa986a5185 (patch)
tree4692b6b4cda88685486d2a7054220edf0fc39262 /drivers/bcma
parenta35ab937cb27ec8c00b6f13cade93dc10e22b670 (diff)
bcma: don't map/unmap a subset of the PCI config space
For PCI config space access offsets < 256 for device '0', bcma_extpci_write_config performs an 'ioremap_nocache' on a 4 byte section of the PCI config space (an area that has already previously been mapped), and then subsequently unmaps that 4 byte section. This can't be a good thing for future read access from that now unmapped location. Modify the config space writes to use the existing access functions (similar to how it is done for the reads). Signed-off-by: Nathan Hintz <nlhintz@hotmail.com> Acked-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/bcma')
-rw-r--r--drivers/bcma/driver_pci_host.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/bcma/driver_pci_host.c b/drivers/bcma/driver_pci_host.c
index 4a4152389515..c0cb0620ab62 100644
--- a/drivers/bcma/driver_pci_host.c
+++ b/drivers/bcma/driver_pci_host.c
@@ -149,7 +149,7 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
149 const void *buf, int len) 149 const void *buf, int len)
150{ 150{
151 int err = -EINVAL; 151 int err = -EINVAL;
152 u32 addr = 0, val = 0; 152 u32 addr, val;
153 void __iomem *mmio = 0; 153 void __iomem *mmio = 0;
154 u16 chipid = pc->core->bus->chipinfo.id; 154 u16 chipid = pc->core->bus->chipinfo.id;
155 155
@@ -165,12 +165,10 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
165 * requires indirect access. 165 * requires indirect access.
166 */ 166 */
167 if (off < PCI_CONFIG_SPACE_SIZE) { 167 if (off < PCI_CONFIG_SPACE_SIZE) {
168 addr = pc->core->addr + BCMA_CORE_PCI_PCICFG0; 168 addr = BCMA_CORE_PCI_PCICFG0;
169 addr |= (func << 8); 169 addr |= (func << 8);
170 addr |= (off & 0xfc); 170 addr |= (off & 0xfc);
171 mmio = ioremap_nocache(addr, sizeof(val)); 171 val = pcicore_read32(pc, addr);
172 if (!mmio)
173 goto out;
174 } 172 }
175 } else { 173 } else {
176 addr = bcma_get_cfgspace_addr(pc, dev, func, off); 174 addr = bcma_get_cfgspace_addr(pc, dev, func, off);
@@ -189,12 +187,10 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
189 187
190 switch (len) { 188 switch (len) {
191 case 1: 189 case 1:
192 val = readl(mmio);
193 val &= ~(0xFF << (8 * (off & 3))); 190 val &= ~(0xFF << (8 * (off & 3)));
194 val |= *((const u8 *)buf) << (8 * (off & 3)); 191 val |= *((const u8 *)buf) << (8 * (off & 3));
195 break; 192 break;
196 case 2: 193 case 2:
197 val = readl(mmio);
198 val &= ~(0xFFFF << (8 * (off & 3))); 194 val &= ~(0xFFFF << (8 * (off & 3)));
199 val |= *((const u16 *)buf) << (8 * (off & 3)); 195 val |= *((const u16 *)buf) << (8 * (off & 3));
200 break; 196 break;
@@ -202,13 +198,17 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
202 val = *((const u32 *)buf); 198 val = *((const u32 *)buf);
203 break; 199 break;
204 } 200 }
205 if (dev == 0 && !addr) { 201 if (dev == 0) {
206 /* accesses to config registers with offsets >= 256 202 /* accesses to config registers with offsets >= 256
207 * requires indirect access. 203 * requires indirect access.
208 */ 204 */
209 addr = (func << 12); 205 if (off >= PCI_CONFIG_SPACE_SIZE) {
210 addr |= (off & 0x0FFF); 206 addr = (func << 12);
211 bcma_pcie_write_config(pc, addr, val); 207 addr |= (off & 0x0FFF);
208 bcma_pcie_write_config(pc, addr, val);
209 } else {
210 pcicore_write32(pc, addr, val);
211 }
212 } else { 212 } else {
213 writel(val, mmio); 213 writel(val, mmio);
214 214