2011-01-31 11:37:56

by Senthil Balasubramanian

[permalink] [raw]
Subject: [PATCH 1/1] compat-wireless: Fix ath9k debug log issue.

ath9k debug logs are not shown as we are using recursive vsnprintf
which are supported in kernel 2.6.36 and above. use vprintk for older
kernels.

This patch has fixed the issue.

Signed-off-by: Senthil Balasubramanian <[email protected]>
---
patches/37-vsnprintk.patch | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
create mode 100644 patches/37-vsnprintk.patch

diff --git a/patches/37-vsnprintk.patch b/patches/37-vsnprintk.patch
new file mode 100644
index 0000000..93d1a00
--- /dev/null
+++ b/patches/37-vsnprintk.patch
@@ -0,0 +1,28 @@
+diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
+index c325202..e3e60d4 100644
+--- a/drivers/net/wireless/ath/main.c
++++ b/drivers/net/wireless/ath/main.c
+@@ -60,16 +60,23 @@ EXPORT_SYMBOL(ath_rxbuf_alloc);
+ int ath_printk(const char *level, struct ath_common *common,
+ const char *fmt, ...)
+ {
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
+ struct va_format vaf;
++#endif
+ va_list args;
+ int rtn;
+
+ va_start(args, fmt);
+
++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ rtn = printk("%sath: %pV", level, &vaf);
++#else
++ printk("%sath: ", level);
++ rtn = vprintk(fmt, args);
++#endif
+
+ va_end(args);
+
--
1.7.0.4



2011-01-31 18:58:18

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH 1/1] compat-wireless: Fix ath9k debug log issue.

On Mon, 2011-01-31 at 17:07 +0530, Senthil Balasubramanian wrote:
> ath9k debug logs are not shown as we are using recursive vsnprintf
> which are supported in kernel 2.6.36 and above. use vprintk for older
> kernels.

#ifdefs spread around the tree for this sort of
change are not very nice.

Perhaps wireless-compat should not be an impediment to
mainline progress and these sorts of changes should be
minimized.

If this is really necessary for backward compatibility,
I think the %pV could just be removed.

If not, because this style would be used in several
places, perhaps another macro could be used to hide the
use of %pV.

Maybe something like:

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
#define PRINTK_VA_LIST(level, prefix, fmt, __va_list) \
({ \
struct va_format vaf; \
\
vaf.fmt = fmt; \
vaf.va = &__va_list; \
\
printk("%s" prefix "%pV", level, &vaf); \
})
#else
#define PRINTK_VA_LIST(level, prefix, fmt, __va_list) \
({ \
printk("%s" prefix, level); \
vprintk(fmt, __va_list); \
})
#endif

> +diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
> +index c325202..e3e60d4 100644
> +--- a/drivers/net/wireless/ath/main.c
> ++++ b/drivers/net/wireless/ath/main.c
> +@@ -60,16 +60,23 @@ EXPORT_SYMBOL(ath_rxbuf_alloc);
> + int ath_printk(const char *level, struct ath_common *common,
> + const char *fmt, ...)
> + {
> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
> + struct va_format vaf;
> ++#endif
> + va_list args;
> + int rtn;
> +
> + va_start(args, fmt);
> +
> ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
> + vaf.fmt = fmt;
> + vaf.va = &args;
> +
> + rtn = printk("%sath: %pV", level, &vaf);
> ++#else
> ++ printk("%sath: ", level);
> ++ rtn = vprintk(fmt, args);
> ++#endif
> +
> + va_end(args);
> +

So this would become something like:

int ath_printk(const char *level, struct ath_common *common,
const char *fmt, ...)
{
va_list args;
int rtn;

va_start(args, fmt);

rtn = PRINTK_VA_LIST(level, "ath: ", fmt, args);

va_end(args);

return rtn;
}



2011-02-01 13:33:10

by Senthil Balasubramanian

[permalink] [raw]
Subject: Re: [PATCH 1/1] compat-wireless: Fix ath9k debug log issue.

On Tue, Feb 01, 2011 at 12:28:16AM +0530, Joe Perches wrote:
> On Mon, 2011-01-31 at 17:07 +0530, Senthil Balasubramanian wrote:
> > ath9k debug logs are not shown as we are using recursive vsnprintf
> > which are supported in kernel 2.6.36 and above. use vprintk for older
> > kernels.
>
> #ifdefs spread around the tree for this sort of
> change are not very nice.
#if LINUX_VERSION is unavoidable in compat wireless and compat is actually
meant for that.
>
> Perhaps wireless-compat should not be an impediment to
> mainline progress and these sorts of changes should be
> minimized.
>
> If this is really necessary for backward compatibility,
> I think the %pV could just be removed.
May be this can be done if we are really worried about the no.of patches
in compat folder.
>
> If not, because this style would be used in several
> places, perhaps another macro could be used to hide the
> use of %pV.
>
> Maybe something like:
you mean use this in wireless-testing ??. We should not
add if kernel version checks in wireless-testing code and
I don't prefer that either.

>
> #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
> #define PRINTK_VA_LIST(level, prefix, fmt, __va_list) \
> ({ \
> struct va_format vaf; \
> \
> vaf.fmt = fmt; \
> vaf.va = &__va_list; \
> \
> printk("%s" prefix "%pV", level, &vaf); \
> })
> #else
> #define PRINTK_VA_LIST(level, prefix, fmt, __va_list) \
> ({ \
> printk("%s" prefix, level); \
> vprintk(fmt, __va_list); \
> })
> #endif
>
> > +diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
> > +index c325202..e3e60d4 100644
> > +--- a/drivers/net/wireless/ath/main.c
> > ++++ b/drivers/net/wireless/ath/main.c
> > +@@ -60,16 +60,23 @@ EXPORT_SYMBOL(ath_rxbuf_alloc);
> > + int ath_printk(const char *level, struct ath_common *common,
> > + const char *fmt, ...)
> > + {
> > ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
> > + struct va_format vaf;
> > ++#endif
> > + va_list args;
> > + int rtn;
> > +
> > + va_start(args, fmt);
> > +
> > ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))
> > + vaf.fmt = fmt;
> > + vaf.va = &args;
> > +
> > + rtn = printk("%sath: %pV", level, &vaf);
> > ++#else
> > ++ printk("%sath: ", level);
> > ++ rtn = vprintk(fmt, args);
> > ++#endif
> > +
> > + va_end(args);
> > +
>
> So this would become something like:
>
> int ath_printk(const char *level, struct ath_common *common,
> const char *fmt, ...)
> {
> va_list args;
> int rtn;
>
> va_start(args, fmt);
>
> rtn = PRINTK_VA_LIST(level, "ath: ", fmt, args);
>
> va_end(args);
>
> return rtn;
> }
>
>