hp iPAQ h5[4,5]xx porting patch
Erik Hovland <[email protected]> Mon, 28 Feb 2005 15:50:17 -0800
| Newsgroups | gmane.linux.drivers.at76c503a.user |
|---|---|
| Message-ID | <[email protected]> |
I was wondering if this list and the developers of the berlios driver have seen the attached patch? I am interested in getting this patch or some version of this patch included into the berlios driver as I want to begin getting the iPAQ bits ready for the 2.6 kernel. This patch was plucked out of the OE bitkeeper repository and is in use in familiar 0.8.x on the hp iPAQ h5400 and h5500. Thanks E -- Erik Hovland mail: erik AT hovland DOT org web: http://hovland.org/ PGP/GPG public key available on request
at76c503a-cvs-h5400-port.patch
(text/plain, 4.1 KB)
Index: at76c503-fw_skel.c
===================================================================
RCS file: /cvsroot/at76c503a/at76c503a/at76c503-fw_skel.c,v
retrieving revision 1.6
diff -u -r1.6 at76c503-fw_skel.c
--- at76c503-fw_skel.c 18 Mar 2004 20:54:57 -0000 1.6
+++ at76c503-fw_skel.c 5 Jul 2004 19:46:45 -0000
@@ -23,6 +23,12 @@
*
*/
+#ifdef CONFIG_IPAQ_HANDHELD
+#include <asm/mach-types.h>
+#include <asm/arch/ipaq.h>
+#include <asm/arch-pxa/h5400-asic.h>
+#endif
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
extern inline char *fw_dev_param(struct usb_device *udev, char *buf)
{
@@ -173,6 +179,15 @@
info(DRIVER_DESC " " DRIVER_VERSION " loading");
+#ifdef CONFIG_IPAQ_HANDHELD
+ if (machine_is_h5400()) {
+ /* turn WLAN power on */
+ /* both needed? */
+ SET_H5400_ASIC_GPIO (GPB, RF_POWER_ON, 1);
+ SET_H5400_ASIC_GPIO (GPB, WLAN_POWER_ON, 1);
+ }
+#endif
+
/* register this driver with the USB subsystem */
result = usb_register(&module_usb);
if (result < 0) {
@@ -192,6 +207,14 @@
if (static_fw.size == 0 && fw != NULL)
/* we had loaded and allocated the buffer before */
release_firmware(fw);
+#endif
+
+#ifdef CONFIG_IPAQ_HANDHELD
+ if (machine_is_h5400()) {
+ /* turn WLAN power off */
+ SET_H5400_ASIC_GPIO (GPB, RF_POWER_ON, 0);
+ SET_H5400_ASIC_GPIO (GPB, WLAN_POWER_ON, 0);
+ }
#endif
}
Index: at76c503.c
===================================================================
RCS file: /cvsroot/at76c503a/at76c503a/at76c503.c,v
retrieving revision 1.55
diff -u -r1.55 at76c503.c
--- at76c503.c 31 May 2004 13:59:27 -0000 1.55
+++ at76c503.c 5 Jul 2004 19:46:51 -0000
@@ -110,6 +110,12 @@
#endif // #if WIRELESS_EXT > 12
#include <linux/rtnetlink.h> /* for rtnl_lock() */
+#include <net/iw_handler.h>
+
+#ifdef CONFIG_IPAQ_HANDHELD
+#include <asm/mach-types.h>
+#include <asm/arch-sa1100/h3600.h>
+#endif
#include "at76c503.h"
#include "ieee802_11.h"
@@ -238,8 +244,23 @@
#define ASSOC_RETRIES 3
#define DISASSOC_RETRIES 3
+#ifdef CONFIG_IPAQ_HANDHELD
+#define scan_hook(x) \
+ do { \
+ if (machine_is_h5400()) { \
+ if (x) \
+ ipaq_led_blink (RED_LED, 1, 2); \
+ else \
+ ipaq_led_off (RED_LED); \
+ } \
+ } while (0)
+#else
+#define scan_hook(x)
+#endif
+
#define NEW_STATE(dev,newstate) \
do {\
+ scan_hook(newstate == SCANNING); \
dbg(DBG_PROGRESS, "%s: state %d -> %d (" #newstate ")",\
dev->netdev->name, dev->istate, newstate);\
dev->istate = newstate;\
@@ -3958,6 +3979,34 @@
}
+#ifdef CONFIG_IPAQ_HANDHELD
+
+static struct timer_list led_timer;
+
+static void
+ipaq_clear_led (unsigned long time)
+{
+ ipaq_led_off (RED_LED_2);
+}
+
+static void
+ipaq_blink_led (void)
+{
+ ipaq_led_on (RED_LED_2);
+
+ mod_timer (&led_timer, jiffies + (HZ / 25));
+}
+
+static void
+ipaq_init_led (void)
+{
+ led_timer.function = ipaq_clear_led;
+
+ init_timer (&led_timer);
+}
+
+#endif
+
static int
at76c503_tx(struct sk_buff *skb, struct net_device *netdev)
{
@@ -3972,6 +4021,11 @@
struct ieee802_11_hdr *i802_11_hdr =
(struct ieee802_11_hdr *)&(tx_buffer->packet);
+#ifdef CONFIG_IPAQ_HANDHELD
+ if (machine_is_h5400 ())
+ ipaq_blink_led ();
+#endif
+
/* we can get rid of memcpy, if we set netdev->hard_header_len
to 8 + sizeof(struct ieee802_11_hdr), because then we have
enough space */
@@ -6273,6 +6327,12 @@
}
dbg(DBG_PROC_ENTRY, "%s: before freeing dev/netdev", __FUNCTION__);
free_netdev(dev->netdev); /* dev is in net_dev */
+#ifdef CONFIG_IPAQ_HANDHELD
+ if (machine_is_h5400()) {
+ ipaq_led_off (RED_LED);
+ ipaq_led_off (RED_LED_2);
+ }
+#endif
dbg(DBG_PROC_ENTRY, "%s: EXIT", __FUNCTION__);
}
@@ -6451,6 +6511,11 @@
/* we let this timer run the whole time this driver instance lives */
mod_timer(&dev->bss_list_timer, jiffies+BSS_LIST_TIMEOUT);
+#ifdef CONFIG_IPAQ_HANDHELD
+ if (machine_is_h5400 ())
+ ipaq_init_led ();
+#endif
+
if(at76c503_alloc_urbs(dev) < 0)
goto error;
@@ -6534,7 +6599,7 @@
if (ret) {
err("unable to register netdevice %s (status %d)!",
dev->netdev->name, ret);
- goto error;
+ return -1;
}
info("registered %s", dev->netdev->name);
dev->flags |= AT76C503A_NETDEV_REGISTERED;