summaryrefslogtreecommitdiff
path: root/package/madwifi/patches/109-soc_platform.patch
blob: d677c04c4d6e4f803cdab73cbd98b474f5d09f88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
diff -ur madwifi.old/ath/if_ath_ahb.c madwifi.dev/ath/if_ath_ahb.c
--- madwifi.old/ath/if_ath_ahb.c	2006-12-16 00:57:08.000000000 +0100
+++ madwifi.dev/ath/if_ath_ahb.c	2006-12-16 01:29:38.000000000 +0100
@@ -17,6 +17,9 @@
 #include <linux/if.h>
 #include <linux/netdevice.h>
 #include <linux/cache.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+#include <linux/platform_device.h>
+#endif
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -39,6 +42,7 @@
 static struct ath_ahb_softc *sclist[2] = {NULL, NULL};
 static u_int8_t num_activesc = 0;
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
 static struct ar531x_boarddata *ar5312_boardConfig = NULL;
 static char *radioConfig = NULL;
 
@@ -136,6 +140,8 @@
 		data[i] = eepromAddr[off];
 }
 
+#endif
+
 /* set bus cachesize in 4B word units */
 void
 bus_read_cachesize(struct ath_softc *sc, u_int8_t *csz)
@@ -295,7 +301,7 @@
 }
 
 int
-init_ath_wmac(u_int16_t devid, u_int16_t wlanNum)
+init_ath_wmac(u_int16_t devid, u_int16_t wlanNum, struct ar531x_config *config)
 {
 	const char *athname;
 	struct net_device *dev;
@@ -352,12 +358,7 @@
 		goto bad3;
 	}
 	
-	struct ar531x_config config;
-	config.board = ar5312_boardConfig;
-	config.radio = radioConfig;
-	config.unit = wlanNum;
-	config.tag = NULL;
-	if (ath_attach(devid, dev, &config) != 0)
+	if (ath_attach(devid, dev, config) != 0)
 		goto bad4;
 	athname = ath_hal_probe(ATHEROS_VENDOR_ID, devid);
 	printk(KERN_INFO "%s: %s: mem=0x%lx, irq=%d\n",
@@ -379,13 +380,55 @@
 	return -ENODEV;
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+static int ahb_wmac_probe(struct platform_device *pdev)
+{
+	u32 devid;
+	struct ar531x_config *config;
+
+	config = (struct ar531x_config *) pdev->dev.platform_data;
+	devid = (u32) config->tag;
+	config->tag = NULL;
+	
+	return init_ath_wmac((u_int16_t) devid, pdev->id, config);
+}
+
+
+static int ahb_wmac_remove(struct platform_device *pdev)
+{
+	exit_ath_wmac(pdev->id);
+
+	return 0;
+}
+
+struct platform_driver ahb_wmac_driver = {
+	.driver.name = "ar531x-wmac",
+	.probe = ahb_wmac_probe,
+	.remove = ahb_wmac_remove
+};
+
+#else
+
 int
 init_ahb(void)
 {
 	int ret;
 	u_int16_t devid, radioMask;
 	const char *sysType;
+	struct ar531x_config config;
+	
 	sysType = get_system_type();
+	
+	/* Probe to find out the silicon revision and enable the
+	   correct number of macs */
+	if (!ar5312SetupFlash())
+		return -ENODEV;
+
+	config.board = ar5312_boardConfig;
+	config.radio = radioConfig;
+	config.unit = wlanNum;
+	config.tag = NULL;
+
 	if (!strcmp(sysType,"Atheros AR5315")) {
 		devid = (u_int16_t) (sysRegRead(AR5315_SREV) &
 			(AR5315_REV_MAJ_M | AR5315_REV_MIN_M));
@@ -393,10 +436,6 @@
 			return init_ath_wmac(devid, 0);
 	}
 
-	/* Probe to find out the silicon revision and enable the
-	   correct number of macs */
-	if (!ar5312SetupFlash())
-		return -ENODEV;
 	devid = (u_int16_t) ((sysRegRead(AR531X_REV) >>8) &
 		(AR531X_REV_MAJ | AR531X_REV_MIN));
 	switch (devid) {
@@ -420,6 +459,7 @@
 	return 0;
 }
 
+#endif
 
 /*
  * Module glue.
@@ -460,13 +500,19 @@
 {
 	printk(KERN_INFO "%s: %s\n", dev_info, version);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+	platform_driver_register(&ahb_wmac_driver);
+#else
 	if (init_ahb() != 0) {
 		printk("ath_ahb: No devices found, driver not installed.\n");
 		return (-ENODEV);
 	}
+#endif
+
 #ifdef CONFIG_SYSCTL
 	ath_sysctl_register();
 #endif
+
 	return 0;
 }
 module_init(init_ath_ahb);
@@ -477,8 +523,13 @@
 #ifdef CONFIG_SYSCTL
 	ath_sysctl_unregister();
 #endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+	platform_driver_register(&ahb_wmac_driver);
+#else
 	exit_ath_wmac(AR531X_WLAN0_NUM);
 	exit_ath_wmac(AR531X_WLAN1_NUM);
+#endif
 
 	printk(KERN_INFO "%s: driver unloaded\n", dev_info);
 }