Search Linux Wireless

Re: [PATCH 3/5] bcma: don't map/unmap a subset of the PCI config space

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/12/2013 03:38 PM, Hauke Mehrtens wrote:
> On 01/12/2013 11:46 AM, Nathan Hintz wrote:
>> 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@xxxxxxxxxxx>

Acked-by: Hauke Mehrtens <hauke@xxxxxxxxxx>

>> ---
>>  drivers/bcma/driver_pci_host.c |   22 +++++++++++-----------
>>  1 files changed, 11 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/bcma/driver_pci_host.c b/drivers/bcma/driver_pci_host.c
>> index 187cc9f..e1381ba 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,
>>  				   const void *buf, int len)
>>  {
>>  	int err = -EINVAL;
>> -	u32 addr = 0, val = 0;
>> +	u32 addr, val;
>>  	void __iomem *mmio = 0;
>>  	u16 chipid = pc->core->bus->chipinfo.id;
>>  
>> @@ -165,12 +165,10 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
>>  		 * requires indirect access.
>>  		 */
>>  		if (off < PCI_CONFIG_SPACE_SIZE) {
>> -			addr = pc->core->addr + BCMA_CORE_PCI_PCICFG0;
>> +			addr = BCMA_CORE_PCI_PCICFG0;
>>  			addr |= (func << 8);
>>  			addr |= (off & 0xfc);
>> -			mmio = ioremap_nocache(addr, sizeof(val));
>> -			if (!mmio)
>> -				goto out;
>> +			val = pcicore_read32(pc, addr);
>>  		}
> 
> off >= PCI_CONFIG_SPACE_SIZE is not handled here, but I think it should
> be. This part of the function should use the same code as used in
> bcma_extpci_read_config().
> 
> Your patch improves this, but I think there is an other flaw in the code.

I just saw you do this in the next patch, ignore this comment.

> 
>>  	} else {
>>  		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,
>>  
>>  	switch (len) {
>>  	case 1:
>> -		val = readl(mmio);
>>  		val &= ~(0xFF << (8 * (off & 3)));
>>  		val |= *((const u8 *)buf) << (8 * (off & 3));
>>  		break;
>>  	case 2:
>> -		val = readl(mmio);
>>  		val &= ~(0xFFFF << (8 * (off & 3)));
>>  		val |= *((const u16 *)buf) << (8 * (off & 3));
>>  		break;
>> @@ -202,13 +198,17 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
>>  		val = *((const u32 *)buf);
>>  		break;
>>  	}
>> -	if (dev == 0 && !addr) {
>> +	if (dev == 0) {
>>  		/* accesses to config registers with offsets >= 256
>>  		 * requires indirect access.
>>  		 */
>> -		addr = (func << 12);
>> -		addr |= (off & 0x0FFF);
>> -		bcma_pcie_write_config(pc, addr, val);
>> +		if (off >= PCI_CONFIG_SPACE_SIZE) {
>> +			addr = (func << 12);
>> +			addr |= (off & 0x0FFF);
>> +			bcma_pcie_write_config(pc, addr, val);
>> +		} else {
>> +			pcicore_write32(pc, addr, val);
>> +		}
>>  	} else {
>>  		writel(val, mmio);
>>  
>>
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux