* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-03-29 18:54 ` Heiner Kallweit
0 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-03-29 18:54 UTC (permalink / raw)
To: Ulf Hansson; +Cc: linux-mmc, linux-amlogic, Helmut Klein
Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
small DMA buffer not meeting this requirement.
When testing switching to descriptor chain mode in meson-gx driver
SDIO is broken therefore. Fix this by allocating the small DMA buffer
separately as kmalloc ensures that the returned memory area is
properly aligned for every basic data type.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Tested-by: Helmut Klein <hgkr.klein@gmail.com>
---
drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
include/linux/mmc/sdio_func.h | 2 +-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
index e992a7f8..2b32b889 100644
--- a/drivers/mmc/core/sdio_bus.c
+++ b/drivers/mmc/core/sdio_bus.c
@@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
sdio_free_func_cis(func);
kfree(func->info);
-
+ kfree(func->tmpbuf);
kfree(func);
}
@@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
if (!func)
return ERR_PTR(-ENOMEM);
+ /*
+ * allocate buffer separately to make sure it's properly aligned for
+ * DMA usage (incl. 64 bit DMA)
+ */
+ func->tmpbuf = kmalloc(4, GFP_KERNEL);
+ if (!func->tmpbuf) {
+ kfree(func);
+ return ERR_PTR(-ENOMEM);
+ }
+
func->card = card;
device_initialize(&func->dev);
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index aab032a6..97ca1053 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -53,7 +53,7 @@ struct sdio_func {
unsigned int state; /* function state */
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
- u8 tmpbuf[4]; /* DMA:able scratch buffer */
+ u8 *tmpbuf; /* DMA:able scratch buffer */
unsigned num_info; /* number of info strings */
const char **info; /* info strings */
--
2.12.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-03-29 18:54 ` Heiner Kallweit
0 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-03-29 18:54 UTC (permalink / raw)
To: linus-amlogic
Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
small DMA buffer not meeting this requirement.
When testing switching to descriptor chain mode in meson-gx driver
SDIO is broken therefore. Fix this by allocating the small DMA buffer
separately as kmalloc ensures that the returned memory area is
properly aligned for every basic data type.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Tested-by: Helmut Klein <hgkr.klein@gmail.com>
---
drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
include/linux/mmc/sdio_func.h | 2 +-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
index e992a7f8..2b32b889 100644
--- a/drivers/mmc/core/sdio_bus.c
+++ b/drivers/mmc/core/sdio_bus.c
@@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
sdio_free_func_cis(func);
kfree(func->info);
-
+ kfree(func->tmpbuf);
kfree(func);
}
@@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
if (!func)
return ERR_PTR(-ENOMEM);
+ /*
+ * allocate buffer separately to make sure it's properly aligned for
+ * DMA usage (incl. 64 bit DMA)
+ */
+ func->tmpbuf = kmalloc(4, GFP_KERNEL);
+ if (!func->tmpbuf) {
+ kfree(func);
+ return ERR_PTR(-ENOMEM);
+ }
+
func->card = card;
device_initialize(&func->dev);
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index aab032a6..97ca1053 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -53,7 +53,7 @@ struct sdio_func {
unsigned int state; /* function state */
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
- u8 tmpbuf[4]; /* DMA:able scratch buffer */
+ u8 *tmpbuf; /* DMA:able scratch buffer */
unsigned num_info; /* number of info strings */
const char **info; /* info strings */
--
2.12.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
2017-03-29 18:54 ` Heiner Kallweit
@ 2017-03-29 20:17 ` Kevin Hilman
-1 siblings, 0 replies; 10+ messages in thread
From: Kevin Hilman @ 2017-03-29 20:17 UTC (permalink / raw)
To: Heiner Kallweit; +Cc: Ulf Hansson, linux-amlogic, Helmut Klein, linux-mmc
Heiner Kallweit <hkallweit1@gmail.com> writes:
> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
> small DMA buffer not meeting this requirement.
> When testing switching to descriptor chain mode in meson-gx driver
> SDIO is broken therefore. Fix this by allocating the small DMA buffer
> separately as kmalloc ensures that the returned memory area is
> properly aligned for every basic data type.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
This should work too, without the need to do a tiny kmalloc.
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index aab032a6ae61..071addf23931 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -53,7 +53,7 @@ struct sdio_func {
unsigned int state; /* function state */
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
- u8 tmpbuf[4]; /* DMA:able scratch buffer */
+ u8 tmpbuf[4] __aligned(8); /* DMA:able scratch buffer */
unsigned num_info; /* number of info strings */
const char **info; /* info strings */
Kevin
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-03-29 20:17 ` Kevin Hilman
0 siblings, 0 replies; 10+ messages in thread
From: Kevin Hilman @ 2017-03-29 20:17 UTC (permalink / raw)
To: linus-amlogic
Heiner Kallweit <hkallweit1@gmail.com> writes:
> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
> small DMA buffer not meeting this requirement.
> When testing switching to descriptor chain mode in meson-gx driver
> SDIO is broken therefore. Fix this by allocating the small DMA buffer
> separately as kmalloc ensures that the returned memory area is
> properly aligned for every basic data type.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
This should work too, without the need to do a tiny kmalloc.
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index aab032a6ae61..071addf23931 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -53,7 +53,7 @@ struct sdio_func {
unsigned int state; /* function state */
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
- u8 tmpbuf[4]; /* DMA:able scratch buffer */
+ u8 tmpbuf[4] __aligned(8); /* DMA:able scratch buffer */
unsigned num_info; /* number of info strings */
const char **info; /* info strings */
Kevin
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
2017-03-29 20:17 ` Kevin Hilman
@ 2017-03-29 20:40 ` Heiner Kallweit
-1 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-03-29 20:40 UTC (permalink / raw)
To: Kevin Hilman; +Cc: Ulf Hansson, linux-amlogic, Helmut Klein, linux-mmc
Am 29.03.2017 um 22:17 schrieb Kevin Hilman:
> Heiner Kallweit <hkallweit1@gmail.com> writes:
>
>> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
>> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
>> small DMA buffer not meeting this requirement.
>> When testing switching to descriptor chain mode in meson-gx driver
>> SDIO is broken therefore. Fix this by allocating the small DMA buffer
>> separately as kmalloc ensures that the returned memory area is
>> properly aligned for every basic data type.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
>
> This should work too, without the need to do a tiny kmalloc.
>
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index aab032a6ae61..071addf23931 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -53,7 +53,7 @@ struct sdio_func {
> unsigned int state; /* function state */
> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>
> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
> + u8 tmpbuf[4] __aligned(8); /* DMA:able scratch buffer */
>
Yes, that's possible too. Actually I wasn't 100% sure whether the alignment
is applied to each member of the array or the array itself. But after a small
test it seems to be applied to the array.
So let's go with this version, thanks for the hint.
Heiner
> unsigned num_info; /* number of info strings */
> const char **info; /* info strings */
>
> Kevin
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-03-29 20:40 ` Heiner Kallweit
0 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-03-29 20:40 UTC (permalink / raw)
To: linus-amlogic
Am 29.03.2017 um 22:17 schrieb Kevin Hilman:
> Heiner Kallweit <hkallweit1@gmail.com> writes:
>
>> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
>> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
>> small DMA buffer not meeting this requirement.
>> When testing switching to descriptor chain mode in meson-gx driver
>> SDIO is broken therefore. Fix this by allocating the small DMA buffer
>> separately as kmalloc ensures that the returned memory area is
>> properly aligned for every basic data type.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
>
> This should work too, without the need to do a tiny kmalloc.
>
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index aab032a6ae61..071addf23931 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -53,7 +53,7 @@ struct sdio_func {
> unsigned int state; /* function state */
> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>
> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
> + u8 tmpbuf[4] __aligned(8); /* DMA:able scratch buffer */
>
Yes, that's possible too. Actually I wasn't 100% sure whether the alignment
is applied to each member of the array or the array itself. But after a small
test it seems to be applied to the array.
So let's go with this version, thanks for the hint.
Heiner
> unsigned num_info; /* number of info strings */
> const char **info; /* info strings */
>
> Kevin
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
2017-03-29 18:54 ` Heiner Kallweit
@ 2017-04-18 19:15 ` Ulf Hansson
-1 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2017-04-18 19:15 UTC (permalink / raw)
To: Heiner Kallweit; +Cc: linux-mmc, linux-amlogic, Helmut Klein
On 29 March 2017 at 20:54, Heiner Kallweit <hkallweit1@gmail.com> wrote:
> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
> small DMA buffer not meeting this requirement.
> When testing switching to descriptor chain mode in meson-gx driver
> SDIO is broken therefore. Fix this by allocating the small DMA buffer
> separately as kmalloc ensures that the returned memory area is
> properly aligned for every basic data type.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
Heiner, sorry for the delay!
I decided to pick this first version as it is more consistent for how
we deal with DMA friendly buffers in the core.
Thanks, applied for fixes!
Kind regards
Uffe
> ---
> drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
> include/linux/mmc/sdio_func.h | 2 +-
> 2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index e992a7f8..2b32b889 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
> sdio_free_func_cis(func);
>
> kfree(func->info);
> -
> + kfree(func->tmpbuf);
> kfree(func);
> }
>
> @@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
> if (!func)
> return ERR_PTR(-ENOMEM);
>
> + /*
> + * allocate buffer separately to make sure it's properly aligned for
> + * DMA usage (incl. 64 bit DMA)
> + */
> + func->tmpbuf = kmalloc(4, GFP_KERNEL);
> + if (!func->tmpbuf) {
> + kfree(func);
> + return ERR_PTR(-ENOMEM);
> + }
> +
> func->card = card;
>
> device_initialize(&func->dev);
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index aab032a6..97ca1053 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -53,7 +53,7 @@ struct sdio_func {
> unsigned int state; /* function state */
> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>
> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
> + u8 *tmpbuf; /* DMA:able scratch buffer */
>
> unsigned num_info; /* number of info strings */
> const char **info; /* info strings */
> --
> 2.12.1
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-04-18 19:15 ` Ulf Hansson
0 siblings, 0 replies; 10+ messages in thread
From: Ulf Hansson @ 2017-04-18 19:15 UTC (permalink / raw)
To: linus-amlogic
On 29 March 2017 at 20:54, Heiner Kallweit <hkallweit1@gmail.com> wrote:
> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
> small DMA buffer not meeting this requirement.
> When testing switching to descriptor chain mode in meson-gx driver
> SDIO is broken therefore. Fix this by allocating the small DMA buffer
> separately as kmalloc ensures that the returned memory area is
> properly aligned for every basic data type.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
Heiner, sorry for the delay!
I decided to pick this first version as it is more consistent for how
we deal with DMA friendly buffers in the core.
Thanks, applied for fixes!
Kind regards
Uffe
> ---
> drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
> include/linux/mmc/sdio_func.h | 2 +-
> 2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
> index e992a7f8..2b32b889 100644
> --- a/drivers/mmc/core/sdio_bus.c
> +++ b/drivers/mmc/core/sdio_bus.c
> @@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
> sdio_free_func_cis(func);
>
> kfree(func->info);
> -
> + kfree(func->tmpbuf);
> kfree(func);
> }
>
> @@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
> if (!func)
> return ERR_PTR(-ENOMEM);
>
> + /*
> + * allocate buffer separately to make sure it's properly aligned for
> + * DMA usage (incl. 64 bit DMA)
> + */
> + func->tmpbuf = kmalloc(4, GFP_KERNEL);
> + if (!func->tmpbuf) {
> + kfree(func);
> + return ERR_PTR(-ENOMEM);
> + }
> +
> func->card = card;
>
> device_initialize(&func->dev);
> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
> index aab032a6..97ca1053 100644
> --- a/include/linux/mmc/sdio_func.h
> +++ b/include/linux/mmc/sdio_func.h
> @@ -53,7 +53,7 @@ struct sdio_func {
> unsigned int state; /* function state */
> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>
> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
> + u8 *tmpbuf; /* DMA:able scratch buffer */
>
> unsigned num_info; /* number of info strings */
> const char **info; /* info strings */
> --
> 2.12.1
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
2017-04-18 19:15 ` Ulf Hansson
@ 2017-04-18 19:20 ` Heiner Kallweit
-1 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-04-18 19:20 UTC (permalink / raw)
To: Ulf Hansson; +Cc: linux-mmc, linux-amlogic, Helmut Klein
Am 18.04.2017 um 21:15 schrieb Ulf Hansson:
> On 29 March 2017 at 20:54, Heiner Kallweit <hkallweit1@gmail.com> wrote:
>> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
>> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
>> small DMA buffer not meeting this requirement.
>> When testing switching to descriptor chain mode in meson-gx driver
>> SDIO is broken therefore. Fix this by allocating the small DMA buffer
>> separately as kmalloc ensures that the returned memory area is
>> properly aligned for every basic data type.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
>
> Heiner, sorry for the delay!
>
> I decided to pick this first version as it is more consistent for how
> we deal with DMA friendly buffers in the core.
>
I also like it more, it's a little more overhead but cleaner.
Thanks a lot!
> Thanks, applied for fixes!
>
> Kind regards
> Uffe
>
>> ---
>> drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
>> include/linux/mmc/sdio_func.h | 2 +-
>> 2 files changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
>> index e992a7f8..2b32b889 100644
>> --- a/drivers/mmc/core/sdio_bus.c
>> +++ b/drivers/mmc/core/sdio_bus.c
>> @@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
>> sdio_free_func_cis(func);
>>
>> kfree(func->info);
>> -
>> + kfree(func->tmpbuf);
>> kfree(func);
>> }
>>
>> @@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
>> if (!func)
>> return ERR_PTR(-ENOMEM);
>>
>> + /*
>> + * allocate buffer separately to make sure it's properly aligned for
>> + * DMA usage (incl. 64 bit DMA)
>> + */
>> + func->tmpbuf = kmalloc(4, GFP_KERNEL);
>> + if (!func->tmpbuf) {
>> + kfree(func);
>> + return ERR_PTR(-ENOMEM);
>> + }
>> +
>> func->card = card;
>>
>> device_initialize(&func->dev);
>> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
>> index aab032a6..97ca1053 100644
>> --- a/include/linux/mmc/sdio_func.h
>> +++ b/include/linux/mmc/sdio_func.h
>> @@ -53,7 +53,7 @@ struct sdio_func {
>> unsigned int state; /* function state */
>> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>>
>> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
>> + u8 *tmpbuf; /* DMA:able scratch buffer */
>>
>> unsigned num_info; /* number of info strings */
>> const char **info; /* info strings */
>> --
>> 2.12.1
>>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH] mmc: sdio: fix alignment issue in struct sdio_func
@ 2017-04-18 19:20 ` Heiner Kallweit
0 siblings, 0 replies; 10+ messages in thread
From: Heiner Kallweit @ 2017-04-18 19:20 UTC (permalink / raw)
To: linus-amlogic
Am 18.04.2017 um 21:15 schrieb Ulf Hansson:
> On 29 March 2017 at 20:54, Heiner Kallweit <hkallweit1@gmail.com> wrote:
>> Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
>> used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
>> small DMA buffer not meeting this requirement.
>> When testing switching to descriptor chain mode in meson-gx driver
>> SDIO is broken therefore. Fix this by allocating the small DMA buffer
>> separately as kmalloc ensures that the returned memory area is
>> properly aligned for every basic data type.
>>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> Tested-by: Helmut Klein <hgkr.klein@gmail.com>
>
> Heiner, sorry for the delay!
>
> I decided to pick this first version as it is more consistent for how
> we deal with DMA friendly buffers in the core.
>
I also like it more, it's a little more overhead but cleaner.
Thanks a lot!
> Thanks, applied for fixes!
>
> Kind regards
> Uffe
>
>> ---
>> drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
>> include/linux/mmc/sdio_func.h | 2 +-
>> 2 files changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
>> index e992a7f8..2b32b889 100644
>> --- a/drivers/mmc/core/sdio_bus.c
>> +++ b/drivers/mmc/core/sdio_bus.c
>> @@ -267,7 +267,7 @@ static void sdio_release_func(struct device *dev)
>> sdio_free_func_cis(func);
>>
>> kfree(func->info);
>> -
>> + kfree(func->tmpbuf);
>> kfree(func);
>> }
>>
>> @@ -282,6 +282,16 @@ struct sdio_func *sdio_alloc_func(struct mmc_card *card)
>> if (!func)
>> return ERR_PTR(-ENOMEM);
>>
>> + /*
>> + * allocate buffer separately to make sure it's properly aligned for
>> + * DMA usage (incl. 64 bit DMA)
>> + */
>> + func->tmpbuf = kmalloc(4, GFP_KERNEL);
>> + if (!func->tmpbuf) {
>> + kfree(func);
>> + return ERR_PTR(-ENOMEM);
>> + }
>> +
>> func->card = card;
>>
>> device_initialize(&func->dev);
>> diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
>> index aab032a6..97ca1053 100644
>> --- a/include/linux/mmc/sdio_func.h
>> +++ b/include/linux/mmc/sdio_func.h
>> @@ -53,7 +53,7 @@ struct sdio_func {
>> unsigned int state; /* function state */
>> #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
>>
>> - u8 tmpbuf[4]; /* DMA:able scratch buffer */
>> + u8 *tmpbuf; /* DMA:able scratch buffer */
>>
>> unsigned num_info; /* number of info strings */
>> const char **info; /* info strings */
>> --
>> 2.12.1
>>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2017-04-18 19:28 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-29 18:54 [PATCH] mmc: sdio: fix alignment issue in struct sdio_func Heiner Kallweit
2017-03-29 18:54 ` Heiner Kallweit
2017-03-29 20:17 ` Kevin Hilman
2017-03-29 20:17 ` Kevin Hilman
2017-03-29 20:40 ` Heiner Kallweit
2017-03-29 20:40 ` Heiner Kallweit
2017-04-18 19:15 ` Ulf Hansson
2017-04-18 19:15 ` Ulf Hansson
2017-04-18 19:20 ` Heiner Kallweit
2017-04-18 19:20 ` Heiner Kallweit
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.