stlc45xx: wi-fi driver for stlc4550/4560 chipset
PATCH 1/1 stlc45xx: wi-fi driver for stlc4550/4560 chipset
I would like to submit stlc45xx for inclusion to wireless-testing tree. Currently the main users are Nokia N800 and N810 products.
Even though this driver has similarities with p54, I still think it would be a good idea to have the driver in Linux mainline. Linux omap community would benefit from this, having a wi-fi driver in the kernel would make the use of N800 and N810 a lot easier. p54 support for these chipsets is not finished yet.
There is still some work to do, for example, add necessary client power save support to mac80211 and modify stlc45xx to use it. Also stlc45xx does not yet use platform data to get all board specific settings, but I will fix that later. And countless others which I don't list here.
Please consider including this driver to the wireless-testing tree.
---
Kalle Valo (1):
Add stlc45xx, wi-fi driver for stlc4550/4560
MAINTAINERS | 8 drivers/net/wireless/Kconfig | 9 drivers/net/wireless/Makefile | 2 drivers/net/wireless/stlc45xx.c | 2594 ++++++++++++++++++++++++++++++++++ drivers/net/wireless/stlc45xx.h | 285 ++++ drivers/net/wireless/stlc45xx_lmac.h | 434 ++++++ 6 files changed, 3332 insertions(+), 0 deletions(-) create mode 100644 drivers/net/wireless/stlc45xx.c create mode 100644 drivers/net/wireless/stlc45xx.h create mode 100644 drivers/net/wireless/stlc45xx_lmac.h
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/1 Add stlc45xx, wi-fi driver for stlc4550/4560
This patch adds a new driver called stlc45xx, which supports wi-fi chipsets stlc4550 and stlc4560 from ST-NXP Wireless. The chipset can be found, for example, from Nokia N800 and N810 products.
The driver is implemented based on the firmware interface information published by ST-NXP Wireless here:
http://wireless.kernel.org/en/developers/Documentation/specs#STMicroelectronicshardware
Currently only SPI interface is supported.
---
MAINTAINERS | 8 drivers/net/wireless/Kconfig | 9 drivers/net/wireless/Makefile | 2 drivers/net/wireless/stlc45xx.c | 2594 ++++++++++++++++++++++++++++++++++ drivers/net/wireless/stlc45xx.h | 285 ++++ drivers/net/wireless/stlc45xx_lmac.h | 434 ++++++ 6 files changed, 3332 insertions(+), 0 deletions(-) create mode 100644 drivers/net/wireless/stlc45xx.c create mode 100644 drivers/net/wireless/stlc45xx.h create mode 100644 drivers/net/wireless/stlc45xx_lmac.h
MAINTAINERS +8 -0
@@ -4051,6 +4051,14 @@ STARMODE RADIO IP (STRIP) PROTOCOL DRIVER W: http://mosquitonet.Stanford.EDU/strip.html S: Orphan +STLC45XX WIRELESS DRIVER +P: Kalle Valo +M: [email protected] +L: [email protected] +L: stlc45xx-devel-alIbjA71pjygJ/[email protected] +W: http://stlc45xx.garage.maemo.org/ +S: Maintained + STRADIS MPEG-2 DECODER DRIVER P: Nathan Laredo M: laredo-mXXj517/[email protected]
drivers/net/wireless/Kconfig +9 -0
@@ -580,6 +580,15 @@ config MAC80211_HWSIM To compile this driver as a module, choose M here: the module will be called mac80211_hwsim. If unsure, say N. +config STLC45XX + tristate "stlc4550/4560 support" + depends on MAC80211 && WLAN_80211 && SPI_MASTER + ---help--- + This is a driver for stlc4550 and stlc4560 chipsets. + + To compile this driver as a module, choose M here: the module will be + called stlc45xx. If unsure, say N. + source "drivers/net/wireless/p54/Kconfig" source "drivers/net/wireless/ath5k/Kconfig" source "drivers/net/wireless/ath9k/Kconfig"
drivers/net/wireless/Makefile +2 -0
@@ -55,3 +55,5 @@ obj-$(CONFIG_ATH5K) += ath5k/ obj-$(CONFIG_ATH9K) += ath9k/ obj-$(CONFIG_MAC80211_HWSIM) += mac80211_hwsim.o + +obj-$(CONFIG_STLC45XX) += stlc45xx.o
drivers/net/wireless/stlc45xx.c new file +2594 -0
2,594 lines not on this page · raw message
drivers/net/wireless/stlc45xx.h new file +285 -0
285 lines not on this page · raw message
drivers/net/wireless/stlc45xx_lmac.h new file +434 -0
87 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Part of the diff is not shown here. View the raw message.
Re: [PATCH] Add stlc45xx, wi-fi driver for stlc4550/4560
Quoted 10 lines · Kalle Valo
This patch adds a new driver called stlc45xx, which supports wi-fi chipsets stlc4550 and stlc4560 from ST-NXP Wireless. The chipset can be found, for example, from Nokia N800 and N810 products.
The driver is implemented based on the firmware interface information published by ST-NXP Wireless here:
http://wireless.kernel.org/en/developers/Documentation/specs#STMicroelectronicshardware
Currently only SPI interface is supported.
Crap, just now I realised to try to compile this with pristine wireless-testing tree:
In file included from drivers/net/wireless/stlc45xx.c:24:drivers/net/wireless/stlc45xx.h:27:24: error: mach/board.h: No such file or directory drivers/net/wireless/stlc45xx.c: In function 'stlc45xx_power_off':drivers/net/wireless/stlc45xx.c:958: error: dereferencing pointer to incomplete type drivers/net/wireless/stlc45xx.c:959: error: dereferencing pointer to incomplete type
I usually merge linux-omap to wireless-testing and that's why I didn't notice this. I will implement the platform data solution in v2 which should fix this compile error. But I would still love to hear any comments people have about v1.
Signature · 1 line
Kalle Valo
Johannes Berg
maintainerRe: [PATCH] Add stlc45xx, wi-fi driver for stlc4550/4560
In reply to Kalle ValoQuoted 349 lines · Kalle Valo
drivers/net/wireless/stlc45xx.c new file +349
-0+static const u8 default_cal_channels[] = { +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x6c ,0x09 , +0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 , +0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xe0 ,0x00 ,0xe0 ,0x00 , +0xe0 ,0x00 ,0xe0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 , +0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 , +0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 , +0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 , +0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d , +0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 , +0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 , +0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x71 ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 , +0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 , +0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 , +0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 , +0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 , +0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca , +0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 , +0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 , +0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 , +0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x76 , +0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 , +0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 , +0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 , +0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 , +0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 , +0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b , +0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 , +0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 , +0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a , +0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7b ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff , +0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 , +0x01 ,0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 , +0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab , +0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 , +0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 , +0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 , +0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 , +0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d , +0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 , +0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x80 ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 , +0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xf0 ,0x00 , +0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 , +0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 , +0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 , +0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 , +0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 , +0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 , +0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 , +0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x85 ,0x09 ,0x00 ,0x00 ,0xc9 , +0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 , +0x10 ,0x01 ,0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 , +0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 , +0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 , +0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb , +0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 , +0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 , +0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 , +0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 , +0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x8a ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 , +0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xf0 , +0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 , +0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 , +0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 , +0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b , +0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 , +0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 , +0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d , +0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x8f ,0x09 ,0x00 ,0x00 , +0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 , +0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 , +0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 , +0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 , +0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 , +0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 , +0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 , +0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c , +0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x94 ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 , +0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 , +0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 , +0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 , +0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 , +0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 , +0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 , +0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d , +0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 , +0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x99 ,0x09 ,0x00 , +0x00 ,0xc9 ,0xff ,0xd8 ,0xff ,0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 , +0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 , +0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 , +0x54 ,0x01 ,0xab ,0xf6 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 , +0x42 ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 , +0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc , +0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0xfb ,0x00 ,0xca ,0x79 ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b , +0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 , +0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 , +0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 ,0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 , +0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 , +0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 , +0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x06 ,0x80 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x9e ,0x09 ,0x00 ,0x00 ,0xc9 ,0xff ,0xd8 ,0xff , +0x00 ,0x00 ,0x00 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 ,0x01 ,0x10 , +0x01 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xf0 ,0x00 ,0xd0 ,0x00 , +0xd0 ,0x00 ,0xd0 ,0x00 ,0xd0 ,0x00 ,0x54 ,0x01 ,0xab ,0xf6 ,0xc0 , +0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0xc0 ,0x42 ,0x00 ,0xcb ,0x00 ,0xcb , +0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 ,0xcb ,0x00 , +0xcb ,0x22 ,0x01 ,0x37 ,0xa9 ,0xc0 ,0x33 ,0xc0 ,0x33 ,0xc0 ,0x33 , +0xc0 ,0x33 ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 , +0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0x00 ,0xbc ,0xfb ,0x00 ,0xca ,0x79 , +0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0xc0 ,0x2b ,0x00 ,0xb4 ,0x00 , +0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 ,0x00 ,0xb4 , +0x00 ,0xb4 ,0xd0 ,0x00 ,0x5d ,0x54 ,0xc0 ,0x21 ,0xc0 ,0x21 ,0xc0 , +0x21 ,0xc0 ,0x21 ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa , +0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0x00 ,0xaa ,0xa7 ,0x00 ,0xa9 , +0x3d ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0xc0 ,0x17 ,0x00 ,0xa0 , +0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 ,0xa0 ,0x00 , +0xa0 ,0x00 ,0xa0 ,0x7a ,0x00 ,0x06 ,0x2c ,0xc0 ,0x0d ,0xc0 ,0x0d , +0xc0 ,0x0d ,0xc0 ,0x0d ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 , +0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x96 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x06 ,0x80 ,0x80 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 }; + +static const u8 default_cal_rssi[] = {
drivers/net/wireless/stlc45xx.c line 396
Quoted 10 lines
drivers/net/wireless/stlc45xx.c new file +10
-0+0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 , +0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 , +0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a , +0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe , +0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 , +0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 , +0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a , +0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , + 0x00, 0x00, 0x00, 0x00, 0x00 };
Is this data actually usable? The static data in cx3110x didn't even parse correctly iirc.
drivers/net/wireless/stlc45xx.c line 403
Quoted 6 lines
drivers/net/wireless/stlc45xx.c new file +6
-0+static void stlc45xx_tx_edcf (struct stlc45xx *stlc); +static void stlc45xx_tx_setup (struct stlc45xx *stlc); +static void stlc45xx_tx_scan (struct stlc45xx *stlc); +static void stlc45xx_tx_psm (struct stlc45xx *stlc,bool enable); +static int stlc45xx_tx_nullfunc (struct stlc45xx *stlc,bool powersave); +static int stlc45xx_tx_pspoll (struct stlc45xx *stlc,bool powersave);
Can you reorder the file? And I think you must be basing this on top of your PS patches, so could you not put Vivek's in the middle too?
drivers/net/wireless/stlc45xx.c line 430
Quoted 3 lines
drivers/net/wireless/stlc45xx.c new file +3
-0+static ssize_t stlc45xx_sysfs_store_cal_rssi (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count)
I still think it would be better to use the firmware framework with a custom helper for this. At least it should provide a uevent like crda does so userspace knows automatically when to upload the files after you reload the module for example, I think?
drivers/net/wireless/stlc45xx.c line 519
Quoted 4 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+static ssize_t stlc45xx_sysfs_show_tx_buf (struct device *dev, +struct device_attribute *attr, +char *buf) +{
That should be in debugfs, I think?
drivers/net/wireless/stlc45xx.c line 829
Quoted 7 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+static int stlc45xx_request_firmware (struct stlc45xx *stlc) +{ +const struct firmware *fw; +int ret; + +/* FIXME: should driver use it's own struct device? */ + ret =request_firmware (&fw,"3826.arm" , &stlc->spi->dev);
own struct device? I don't see why it should? It doesn't have one anyway, does it?
drivers/net/wireless/stlc45xx.c line 917
Quoted 11 lines
drivers/net/wireless/stlc45xx.c new file +9
-0+static int stlc45xx_upload_firmware (struct stlc45xx *stlc) + fw_addr =FIRMWARE_ADDRESS ; + fw_len = stlc->fw_len; +stlc45xx_spi_write (stlc,SPI_ADRS_DMA_DATA , stlc->fw, _fw_len); + +/* FIXME: I think this doesn't work if firmware is large, +* this loop goes to second round. fw->data is not +* increased at all! */ + }
Indeed, the last _spi_write above needs to have something like
stlc->fw + fw_addr - FIRMWARE_ADDRESS
drivers/net/wireless/stlc45xx.c line 1398
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +5
-0+/* +* FIXME: this gives warning from __ieee80211_rx() +* +* status.rate_idx = data->rate; +*/
That works on p54, afaik?
Quoted 10 lines
drivers/net/wireless/stlc45xx.c new file +10
-0+ edcf->queues[0 ].aifs =2 ; + edcf->queues[0 ].pad0 =1 ; + edcf->queues[0 ].cwmin =3 ; + edcf->queues[0 ].cwmax =7 ; + edcf->queues[0 ].txop =47 ; + edcf->queues[1 ].aifs =2 ; + edcf->queues[1 ].pad0 =0 ; + edcf->queues[1 ].cwmin =7 ; + edcf->queues[1 ].cwmax =15 ; + edcf->queues[1 ].txop =94 ;
drivers/net/wireless/stlc45xx.c line 1662
Quoted 10 lines
drivers/net/wireless/stlc45xx.c new file +10
-0+ edcf->queues[2 ].aifs =3 ; + edcf->queues[2 ].pad0 =0 ; + edcf->queues[2 ].cwmin =15 ; + edcf->queues[2 ].cwmax =1023 ; + edcf->queues[2 ].txop =0 ; + edcf->queues[3 ].aifs =7 ; + edcf->queues[3 ].pad0 =0 ; + edcf->queues[3 ].cwmin =15 ; + edcf->queues[3 ].cwmax =1023 ; + edcf->queues[3 ].txop =0 ;
Shouldn't that be taking values from mac80211?
drivers/net/wireless/stlc45xx.c line 1714
Quoted 1 line
drivers/net/wireless/stlc45xx.c new file +1
-0+ setup->bratemask =0xffffffff ;
That should also take values from the BSS config.
drivers/net/wireless/stlc45xx.c line 1745
Quoted 2 lines
drivers/net/wireless/stlc45xx.c new file +2
-0+ scan->flags =LM_SCAN_EXIT ; + scan->bratemask =0x15f ;
or that? not sure
drivers/net/wireless/stlc45xx.c line 2066
Quoted 13 lines
drivers/net/wireless/stlc45xx.c new file +12
-0+static int stlc45xx_op_tx (struct ieee80211_hw *hw,struct sk_buff *skb) +{ + entry =stlc45xx_txbuffer_alloc (stlc, skb->len); +if (!entry) { +/* the queue should be stopped before the firmware buffer +* is full, so firmware buffer should always have enough +* space */ +if (net_ratelimit ()) +stlc45xx_warning ("firmware buffer full" ); +spin_unlock_bh (&stlc->tx_lock); +return NETDEV_TX_BUSY ; + }
Just drop the frame please, it's much easier and I want to remove the possibility of not doing so from mac80211 at some point.
drivers/net/wireless/stlc45xx.c line 2112
Quoted 4 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+for (i =0 ; i <8 ; i++) { + rate =ieee80211_get_tx_rate (stlc->hw, info); + data->aloft[i] = rate->hw_value; + }
You can do much better, like p54, which makes minstrel work a lot better :)
drivers/net/wireless/stlc45xx.c line 2214
Quoted 13 lines
drivers/net/wireless/stlc45xx.c new file +13
-0+static int stlc45xx_op_add_interface (struct ieee80211_hw *hw, +struct ieee80211_if_init_conf *conf) +{ +struct stlc45xx *stlc = hw->priv; + +stlc45xx_debug (DEBUG_FUNC ,"%s" , __func__); + +switch (conf->type) { +case NL80211_IFTYPE_STATION : +break ; +default : +return -EOPNOTSUPP ; + }
No need for this any more since we added the interface_types bitmap. But you can keep it as well, for extra error checking.
drivers/net/wireless/stlc45xx.c line 2225
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +5
-0+static void stlc45xx_op_remove_interface (struct ieee80211_hw *hw, +struct ieee80211_if_init_conf *conf) +{ +stlc45xx_debug (DEBUG_FUNC ,"%s" , __func__); +}
You really need to implement this better for proper monitor mode. Maybe it would be simpler to make p54 work? :) It also implements basic rates, slot handling and other things correctly already.
drivers/net/wireless/stlc45xx.c line 2304
Quoted 3 lines
drivers/net/wireless/stlc45xx.c new file +3
-0+/* can't be const, mac80211 writes to this */ +static struct ieee80211_rate stlc45xx_rates[] = { + { .bitrate =10 , .hw_value =0 , .hw_value_short =0 , },
No need to list hw_value_short since you don't use it, mac80211 never uses hw_value or hw_value-short. Since this is identical to the idx you could even just use the idx and leave it off, though this is probably easier to understand (just a little less efficient).
drivers/net/wireless/stlc45xx.c line 2341
Quoted 7 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+/* can't be const, mac80211 writes to this */ +static struct ieee80211_supported_band stlc45xx_band_2ghz = { + .channels = stlc45xx_channels, + .n_channels =ARRAY_SIZE (stlc45xx_channels), + .bitrates = stlc45xx_rates, + .n_bitrates =ARRAY_SIZE (stlc45xx_rates), +};
Actually, I don't think mac80211 writes to this. Not that const or not const matters in the kernel at all, except during compilation.
drivers/net/wireless/stlc45xx.c line 2361
Quoted 7 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+static int stlc45xx_register_mac80211 (struct stlc45xx *stlc) +{ +/* FIXME: SET_IEEE80211_PERM_ADDR() requires default_mac_addr +to be non-const for some strange reason */ +static u8 default_mac_addr[ETH_ALEN ] = { +0x00 ,0x02 ,0xee ,0xc0 ,0xff ,0xee + };
Probably just a missing const in the inline declaration :)
drivers/net/wireless/stlc45xx.c line 2478
Quoted 12 lines
drivers/net/wireless/stlc45xx.c new file +12
-0+ hw->flags =IEEE80211_HW_RX_INCLUDES_FCS | +IEEE80211_HW_SIGNAL_DBM | +IEEE80211_HW_NOISE_DBM ; +/* four bytes for padding */ + hw->extra_tx_headroom =sizeof (struct s_lm_data_out ) +4 ; + +/* unit us */ + hw->channel_change_time =1000 ; + + hw->wiphy->bands[IEEE80211_BAND_2GHZ ] = &stlc45xx_band_2ghz; + +SET_IEEE80211_DEV (hw, &spi->dev);
I don't see you setting interface_types anywhere, that isn't a good thing. mac80211 will automatically create a sta mode interface but that's more a bug than a feature, and you won't be able to recreate it.
drivers/net/wireless/stlc45xx.h line 81
Quoted 2 lines
drivers/net/wireless/stlc45xx.h new file +2
-0+#define MAC2STR (a) ((a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]) +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
Those should be %pM now, I think? Not sure that's in wireless-testing yet though, but that tree still has DECLARE_MAC_BUF etc.
johannes
Re: [PATCH] Add stlc45xx, wi-fi driver for stlc4550/4560
Quoted 6 lines · Johannes Berg
Quoted 3 lines · Kalle Valo
drivers/net/wireless/stlc45xx.c new file +3
-0+static const u8 default_cal_channels[] = { +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 , +0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x6c ,0x09 ,
[...]
Quoted 4 lines
Quoted 4 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+ 0x00 }; + +static const u8 default_cal_rssi[] = { +0x0a ,0x01 ,0x72 ,0xfe ,0x1a ,0x00 ,0x00 ,0x00 ,0x0a ,0x01 ,0x72 ,
[...]
Quoted 3 lines
drivers/net/wireless/stlc45xx.c line 396
Quoted 1 line
drivers/net/wireless/stlc45xx.c new file +1
-0+ 0x00, 0x00, 0x00, 0x00, 0x00 };Is this data actually usable?
Yes, it is. I tested it yesterday and it works ok.
Quoted 1 line
The static data in cx3110x didn't even parse correctly iirc.
I don't even remember cx3110x having any static calibration data, wlan-cal provided it always. But then again I haven't looked at cx3110x for a long time, I might remember wrong.
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 403
Quoted 6 lines
drivers/net/wireless/stlc45xx.c new file +6
-0+static void stlc45xx_tx_edcf (struct stlc45xx *stlc); +static void stlc45xx_tx_setup (struct stlc45xx *stlc); +static void stlc45xx_tx_scan (struct stlc45xx *stlc); +static void stlc45xx_tx_psm (struct stlc45xx *stlc,bool enable); +static int stlc45xx_tx_nullfunc (struct stlc45xx *stlc,bool powersave); +static int stlc45xx_tx_pspoll (struct stlc45xx *stlc,bool powersave);Can you reorder the file?
Sure.
Quoted 2 lines
And I think you must be basing this on top of your PS patches, so could you not put Vivek's in the middle too?
Actually I didn't use my PS patches when I tested this patch. But true, I should try Vivek's patch also with stlc45xx.
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 430
Quoted 3 lines
drivers/net/wireless/stlc45xx.c new file +3
-0+static ssize_t stlc45xx_sysfs_store_cal_rssi (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count)I still think it would be better to use the firmware framework with a custom helper for this. At least it should provide a uevent like crda does so userspace knows automatically when to upload the files after you reload the module for example, I think?
Yeah, you talked about this already and I liked it. I haven't implemented it just because a lack of time. I'll add it to the todo list.
Quoted 7 lines
drivers/net/wireless/stlc45xx.c line 519
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+static ssize_t stlc45xx_sysfs_show_tx_buf (struct device *dev, +struct device_attribute *attr, +char *buf) +{That should be in debugfs, I think?
I think I should even remove it.
Quoted 11 lines
drivers/net/wireless/stlc45xx.c line 829
Quoted 8 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+static int stlc45xx_request_firmware (struct stlc45xx *stlc) +{ +const struct firmware *fw; +int ret; + +/* FIXME: should driver use it's own struct device? */ + ret =request_firmware (&fw,"3826.arm" , &stlc->spi->dev);own struct device? I don't see why it should? It doesn't have one anyway, does it?
There is stlc45xx_device:
ret = platform_device_register(&stlc45xx_device);
All this device class stuff is not yet fully clear to me, that's why I added that comment. I guess I should study this more on a boring train ride.
Quoted 13 lines
drivers/net/wireless/stlc45xx.c line 917
Quoted 11 lines
drivers/net/wireless/stlc45xx.c new file +9
-0+static int stlc45xx_upload_firmware (struct stlc45xx *stlc) + fw_addr =FIRMWARE_ADDRESS ; + fw_len = stlc->fw_len; +stlc45xx_spi_write (stlc,SPI_ADRS_DMA_DATA , stlc->fw, _fw_len); + +/* FIXME: I think this doesn't work if firmware is large, +* this loop goes to second round. fw->data is not +* increased at all! */ + }Indeed, the last
_spi_writeabove needs to have something like
Quoted 1 line
stlc->fw + fw_addr - FIRMWARE_ADDRESS
Thanks, I'll fix it at some point.
Quoted 7 lines
drivers/net/wireless/stlc45xx.c line 1398
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +5
-0+/* +* FIXME: this gives warning from __ieee80211_rx() +* +* status.rate_idx = data->rate; +*/ That works on p54, afaik?
Yes, I haven't looked at this yet.
Quoted 14 lines
Quoted 14 lines
drivers/net/wireless/stlc45xx.c new file +14
-0+ edcf->queues[0 ].aifs =2 ; + edcf->queues[0 ].pad0 =1 ; + edcf->queues[0 ].cwmin =3 ; + edcf->queues[0 ].cwmax =7 ; + edcf->queues[0 ].txop =47 ; + edcf->queues[1 ].aifs =2 ; + edcf->queues[1 ].pad0 =0 ; + edcf->queues[1 ].cwmin =7 ; + edcf->queues[1 ].cwmax =15 ; + edcf->queues[1 ].txop =94 ; + edcf->queues[2 ].aifs =3 ; + edcf->queues[2 ].pad0 =0 ; + edcf->queues[2 ].cwmin =15 ; + edcf->queues[2 ].cwmax =1023 ;
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 1662
Quoted 6 lines
drivers/net/wireless/stlc45xx.c new file +6
-0+ edcf->queues[2 ].txop =0 ; + edcf->queues[3 ].aifs =7 ; + edcf->queues[3 ].pad0 =0 ; + edcf->queues[3 ].cwmin =15 ; + edcf->queues[3 ].cwmax =1023 ; + edcf->queues[3 ].txop =0 ;Shouldn't that be taking values from mac80211?
Definitely, just has been pending on my todo list.
Quoted 3 lines
drivers/net/wireless/stlc45xx.c line 1714
Quoted 1 line
drivers/net/wireless/stlc45xx.c new file +1
-0+ setup->bratemask =0xffffffff ;That should also take values from the BSS config.
Will fix.
Quoted 4 lines
drivers/net/wireless/stlc45xx.c line 1745
Quoted 2 lines
drivers/net/wireless/stlc45xx.c new file +2
-0+ scan->flags =LM_SCAN_EXIT ; + scan->bratemask =0x15f ;or that? not sure
Me neither :)
Quoted 16 lines
drivers/net/wireless/stlc45xx.c line 2066
Quoted 13 lines
drivers/net/wireless/stlc45xx.c new file +12
-0+static int stlc45xx_op_tx (struct ieee80211_hw *hw,struct sk_buff *skb) +{ + entry =stlc45xx_txbuffer_alloc (stlc, skb->len); +if (!entry) { +/* the queue should be stopped before the firmware buffer +* is full, so firmware buffer should always have enough +* space */ +if (net_ratelimit ()) +stlc45xx_warning ("firmware buffer full" ); +spin_unlock_bh (&stlc->tx_lock); +return NETDEV_TX_BUSY ; + }Just drop the frame please, it's much easier and I want to remove the possibility of not doing so from mac80211 at some point.
Will do.
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 2112
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+for (i =0 ; i <8 ; i++) { + rate =ieee80211_get_tx_rate (stlc->hw, info); + data->aloft[i] = rate->hw_value; + }You can do much better, like p54, which makes minstrel work a lot better :)
I'll fix it.
Quoted 8 lines
Quoted 8 lines
drivers/net/wireless/stlc45xx.c new file +8
-0+static int stlc45xx_op_add_interface (struct ieee80211_hw *hw, +struct ieee80211_if_init_conf *conf) +{ +struct stlc45xx *stlc = hw->priv; + +stlc45xx_debug (DEBUG_FUNC ,"%s" , __func__); + +switch (conf->type) {
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 2214
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +5
-0+case NL80211_IFTYPE_STATION : +break ; +default : +return -EOPNOTSUPP ; + }No need for this any more since we added the
interface_typesbitmap. But you can keep it as well, for extra error checking.
I'll keep it anyway.
Quoted 7 lines
drivers/net/wireless/stlc45xx.c line 2225
Quoted 5 lines
drivers/net/wireless/stlc45xx.c new file +5
-0+static void stlc45xx_op_remove_interface (struct ieee80211_hw *hw, +struct ieee80211_if_init_conf *conf) +{ +stlc45xx_debug (DEBUG_FUNC ,"%s" , __func__); +}You really need to implement this better for proper monitor mode.
It's on my todo list.
Quoted 2 lines
Maybe it would be simpler to make p54 work? :) It also implements basic rates, slot handling and other things correctly already.
Due to non-technical reasons I cannot work with p54 and that makes things a bit difficult. So my solution is that I try to make stlc45xx as good as possible, and if someone wants to add spi support to p54 based on stlc45xx that would be just great.
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 2304
Quoted 3 lines
drivers/net/wireless/stlc45xx.c new file +3
-0+/* can't be const, mac80211 writes to this */ +static struct ieee80211_rate stlc45xx_rates[] = { + { .bitrate =10 , .hw_value =0 , .hw_value_short =0 , },No need to list
hw_value_shortsince you don't use it, mac80211 never useshw_valueor hw_value-short. Since this is identical to the idx you could even just use the idx and leave it off, though this is probably easier to understand (just a little less efficient).
I'll drop hw_value_short but I want to keep hw_value. Like you said, it's easier to understand that way.
Quoted 10 lines
drivers/net/wireless/stlc45xx.c line 2341
Quoted 7 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+/* can't be const, mac80211 writes to this */ +static struct ieee80211_supported_band stlc45xx_band_2ghz = { + .channels = stlc45xx_channels, + .n_channels =ARRAY_SIZE (stlc45xx_channels), + .bitrates = stlc45xx_rates, + .n_bitrates =ARRAY_SIZE (stlc45xx_rates), +};Actually, I don't think mac80211 writes to this. Not that const or not const matters in the kernel at all, except during compilation.
Ok, I'll remove the comment.
Quoted 9 lines
drivers/net/wireless/stlc45xx.c line 2361
Quoted 7 lines
drivers/net/wireless/stlc45xx.c new file +7
-0+static int stlc45xx_register_mac80211 (struct stlc45xx *stlc) +{ +/* FIXME: SET_IEEE80211_PERM_ADDR() requires default_mac_addr +to be non-const for some strange reason */ +static u8 default_mac_addr[ETH_ALEN ] = { +0x00 ,0x02 ,0xee ,0xc0 ,0xff ,0xee + };Probably just a missing const in the inline declaration :)
I'll send a patch.
Quoted 8 lines
Quoted 8 lines
drivers/net/wireless/stlc45xx.c new file +8
-0+ hw->flags =IEEE80211_HW_RX_INCLUDES_FCS | +IEEE80211_HW_SIGNAL_DBM | +IEEE80211_HW_NOISE_DBM ; +/* four bytes for padding */ + hw->extra_tx_headroom =sizeof (struct s_lm_data_out ) +4 ; + +/* unit us */ + hw->channel_change_time =1000 ;
Quoted 8 lines
drivers/net/wireless/stlc45xx.c line 2478
Quoted 4 lines
drivers/net/wireless/stlc45xx.c new file +4
-0+ + hw->wiphy->bands[IEEE80211_BAND_2GHZ ] = &stlc45xx_band_2ghz; + +SET_IEEE80211_DEV (hw, &spi->dev);I don't see you setting
interface_typesanywhere, that isn't a good thing. mac80211 will automatically create a sta mode interface but that's more a bug than a feature, and you won't be able to recreate it.
I'll fix it.
Quoted 5 lines
drivers/net/wireless/stlc45xx.h line 81
Quoted 2 lines
drivers/net/wireless/stlc45xx.h new file +2
-0+#define MAC2STR (a) ((a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]) +#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"Those should be %pM now, I think? Not sure that's in wireless-testing yet though, but that tree still has
DECLARE_MAC_BUFetc.
%pM specifier is really cool and I'll add support for that as soon it hits wireless-testing. But I didn't find it from wireless-testing, I guess it will come after the next merge window.
Thank you for reviewing this again.
Signature · 1 line
Kalle Valo