2013-01-12 10:47:15

by Nathan Hintz

[permalink] [raw]
Subject: [PATCH 4/5] bcma: add support for 1 and 2 byte extended config space access

The sanity checks allow 1 and 2 byte reads/writes of the extended
PCI config space to proceed; however, the code only supports 4
byte reads/writes. This patch adds support for 1 and 2 byte
reads/writes of the extended PCI config space.

Signed-off-by: Nathan Hintz <[email protected]>
---
drivers/bcma/driver_pci_host.c | 15 ++++++++-------
1 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/bcma/driver_pci_host.c b/drivers/bcma/driver_pci_host.c
index e1381ba..92800b4 100644
--- a/drivers/bcma/driver_pci_host.c
+++ b/drivers/bcma/driver_pci_host.c
@@ -101,7 +101,7 @@ static int bcma_extpci_read_config(struct bcma_drv_pci *pc, unsigned int dev,
*/
if (off >= PCI_CONFIG_SPACE_SIZE) {
addr = (func << 12);
- addr |= (off & 0x0FFF);
+ addr |= (off & 0x0FFC);
val = bcma_pcie_read_config(pc, addr);
} else {
addr = BCMA_CORE_PCI_PCICFG0;
@@ -164,7 +164,11 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
/* accesses to config registers with offsets >= 256
* requires indirect access.
*/
- if (off < PCI_CONFIG_SPACE_SIZE) {
+ if (off >= PCI_CONFIG_SPACE_SIZE) {
+ addr = (func << 12);
+ addr |= (off & 0x0FFC);
+ val = bcma_pcie_read_config(pc, addr);
+ } else {
addr = BCMA_CORE_PCI_PCICFG0;
addr |= (func << 8);
addr |= (off & 0xfc);
@@ -202,13 +206,10 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
/* accesses to config registers with offsets >= 256
* requires indirect access.
*/
- if (off >= PCI_CONFIG_SPACE_SIZE) {
- addr = (func << 12);
- addr |= (off & 0x0FFF);
+ if (off >= PCI_CONFIG_SPACE_SIZE)
bcma_pcie_write_config(pc, addr, val);
- } else {
+ else
pcicore_write32(pc, addr, val);
- }
} else {
writel(val, mmio);

--
1.7.7.6



2013-01-12 14:44:29

by Hauke Mehrtens

[permalink] [raw]
Subject: Re: [PATCH 4/5] bcma: add support for 1 and 2 byte extended config space access

On 01/12/2013 11:46 AM, Nathan Hintz wrote:
> The sanity checks allow 1 and 2 byte reads/writes of the extended
> PCI config space to proceed; however, the code only supports 4
> byte reads/writes. This patch adds support for 1 and 2 byte
> reads/writes of the extended PCI config space.
>
> Signed-off-by: Nathan Hintz <[email protected]>

Acked-by: Hauke Mehrtens <[email protected]>

> ---
> drivers/bcma/driver_pci_host.c | 15 ++++++++-------
> 1 files changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/bcma/driver_pci_host.c b/drivers/bcma/driver_pci_host.c
> index e1381ba..92800b4 100644
> --- a/drivers/bcma/driver_pci_host.c
> +++ b/drivers/bcma/driver_pci_host.c
> @@ -101,7 +101,7 @@ static int bcma_extpci_read_config(struct bcma_drv_pci *pc, unsigned int dev,
> */
> if (off >= PCI_CONFIG_SPACE_SIZE) {
> addr = (func << 12);
> - addr |= (off & 0x0FFF);
> + addr |= (off & 0x0FFC);
> val = bcma_pcie_read_config(pc, addr);
> } else {
> addr = BCMA_CORE_PCI_PCICFG0;
> @@ -164,7 +164,11 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
> /* accesses to config registers with offsets >= 256
> * requires indirect access.
> */
> - if (off < PCI_CONFIG_SPACE_SIZE) {
> + if (off >= PCI_CONFIG_SPACE_SIZE) {
> + addr = (func << 12);
> + addr |= (off & 0x0FFC);
> + val = bcma_pcie_read_config(pc, addr);
> + } else {
> addr = BCMA_CORE_PCI_PCICFG0;
> addr |= (func << 8);
> addr |= (off & 0xfc);
> @@ -202,13 +206,10 @@ static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev,
> /* accesses to config registers with offsets >= 256
> * requires indirect access.
> */
> - if (off >= PCI_CONFIG_SPACE_SIZE) {
> - addr = (func << 12);
> - addr |= (off & 0x0FFF);
> + if (off >= PCI_CONFIG_SPACE_SIZE)
> bcma_pcie_write_config(pc, addr, val);
> - } else {
> + else
> pcicore_write32(pc, addr, val);
> - }
> } else {
> writel(val, mmio);
>
>