aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ti
diff options
context:
space:
mode:
authorLuciano Coelho <coelho@ti.com>2011-11-29 09:27:31 -0500
committerLuciano Coelho <coelho@ti.com>2012-04-12 01:43:57 -0400
commit6f7dd16cb125468a5393861c22fbecfb52dd9653 (patch)
tree45803828a2b7a5d0808510e73d24af3e075f6e23 /drivers/net/wireless/ti
parent00782136b4d6e2316e0a2a55f3b1fba160e9576e (diff)
wlcore/wl12xx: add chip-specific identify chip operation
Move the code that identifies the chip ID and selects the appropriate firmware to an operation implemented by the lower driver. Also move the quirks definitions into wlcore.h and rename to WLCORE_QUIRK_*. Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/ti')
-rw-r--r--drivers/net/wireless/ti/wl12xx/main.c65
-rw-r--r--drivers/net/wireless/ti/wl12xx/reg.h1
-rw-r--r--drivers/net/wireless/ti/wlcore/boot.c6
-rw-r--r--drivers/net/wireless/ti/wlcore/init.c4
-rw-r--r--drivers/net/wireless/ti/wlcore/main.c57
-rw-r--r--drivers/net/wireless/ti/wlcore/rx.c2
-rw-r--r--drivers/net/wireless/ti/wlcore/tx.c4
-rw-r--r--drivers/net/wireless/ti/wlcore/wl12xx.h11
-rw-r--r--drivers/net/wireless/ti/wlcore/wlcore.h18
9 files changed, 99 insertions, 69 deletions
diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
index ea8480c1fae7..83ed48d206b2 100644
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -29,9 +29,6 @@
29 29
30#include "reg.h" 30#include "reg.h"
31 31
32static struct wlcore_ops wl12xx_ops = {
33};
34
35static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = { 32static struct wlcore_partition_set wl12xx_ptable[PART_TABLE_LEN] = {
36 [PART_DOWN] = { 33 [PART_DOWN] = {
37 .mem = { 34 .mem = {
@@ -131,6 +128,62 @@ static const int wl12xx_rtable[REG_TABLE_LEN] = {
131 [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR, 128 [REG_RAW_FW_STATUS_ADDR] = FW_STATUS_ADDR,
132}; 129};
133 130
131/* TODO: maybe move to a new header file? */
132#define WL127X_FW_NAME_MULTI "ti-connectivity/wl127x-fw-4-mr.bin"
133#define WL127X_FW_NAME_SINGLE "ti-connectivity/wl127x-fw-4-sr.bin"
134#define WL127X_PLT_FW_NAME "ti-connectivity/wl127x-fw-4-plt.bin"
135
136#define WL128X_FW_NAME_MULTI "ti-connectivity/wl128x-fw-4-mr.bin"
137#define WL128X_FW_NAME_SINGLE "ti-connectivity/wl128x-fw-4-sr.bin"
138#define WL128X_PLT_FW_NAME "ti-connectivity/wl128x-fw-4-plt.bin"
139
140static int wl12xx_identify_chip(struct wl1271 *wl)
141{
142 int ret = 0;
143
144 switch (wl->chip.id) {
145 case CHIP_ID_1271_PG10:
146 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
147 wl->chip.id);
148
149 wl->quirks |= WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
150 wl->plt_fw_name = WL127X_PLT_FW_NAME;
151 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
152 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
153 break;
154
155 case CHIP_ID_1271_PG20:
156 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
157 wl->chip.id);
158
159 wl->quirks |= WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
160 wl->plt_fw_name = WL127X_PLT_FW_NAME;
161 wl->sr_fw_name = WL127X_FW_NAME_SINGLE;
162 wl->mr_fw_name = WL127X_FW_NAME_MULTI;
163 break;
164
165 case CHIP_ID_1283_PG20:
166 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
167 wl->chip.id);
168 wl->plt_fw_name = WL128X_PLT_FW_NAME;
169 wl->sr_fw_name = WL128X_FW_NAME_SINGLE;
170 wl->mr_fw_name = WL128X_FW_NAME_MULTI;
171 break;
172 case CHIP_ID_1283_PG10:
173 default:
174 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
175 ret = -ENODEV;
176 goto out;
177 }
178
179out:
180 return ret;
181}
182
183static struct wlcore_ops wl12xx_ops = {
184 .identify_chip = wl12xx_identify_chip,
185};
186
134static int __devinit wl12xx_probe(struct platform_device *pdev) 187static int __devinit wl12xx_probe(struct platform_device *pdev)
135{ 188{
136 struct wl1271 *wl; 189 struct wl1271 *wl;
@@ -180,3 +233,9 @@ module_exit(wl12xx_exit);
180 233
181MODULE_LICENSE("GPL v2"); 234MODULE_LICENSE("GPL v2");
182MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>"); 235MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
236MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
237MODULE_FIRMWARE(WL127X_FW_NAME_MULTI);
238MODULE_FIRMWARE(WL127X_PLT_FW_NAME);
239MODULE_FIRMWARE(WL128X_FW_NAME_SINGLE);
240MODULE_FIRMWARE(WL128X_FW_NAME_MULTI);
241MODULE_FIRMWARE(WL128X_PLT_FW_NAME);
diff --git a/drivers/net/wireless/ti/wl12xx/reg.h b/drivers/net/wireless/ti/wl12xx/reg.h
index c6a474364756..52012ca21c01 100644
--- a/drivers/net/wireless/ti/wl12xx/reg.h
+++ b/drivers/net/wireless/ti/wl12xx/reg.h
@@ -447,7 +447,6 @@ b12-b0 - Supported Rate indicator bits as defined below.
447#define CLK_REQ_OUTN_SEL 0x700 447#define CLK_REQ_OUTN_SEL 0x700
448 448
449#define WU_COUNTER_PAUSE_VAL 0x3FF 449#define WU_COUNTER_PAUSE_VAL 0x3FF
450#define WELP_ARM_COMMAND_VAL 0x4
451 450
452/* PLL configuration algorithm for wl128x */ 451/* PLL configuration algorithm for wl128x */
453#define SYS_CLK_CFG_REG 0x2200 452#define SYS_CLK_CFG_REG 0x2200
diff --git a/drivers/net/wireless/ti/wlcore/boot.c b/drivers/net/wireless/ti/wlcore/boot.c
index 69409ecfb0bb..7c72e16432ca 100644
--- a/drivers/net/wireless/ti/wlcore/boot.c
+++ b/drivers/net/wireless/ti/wlcore/boot.c
@@ -58,11 +58,11 @@ static unsigned int wl12xx_get_fw_ver_quirks(struct wl1271 *wl)
58 /* Only new station firmwares support routing fw logs to the host */ 58 /* Only new station firmwares support routing fw logs to the host */
59 if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) && 59 if ((fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_STA) &&
60 (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN)) 60 (fw_ver[FW_VER_MINOR] < FW_VER_MINOR_FWLOG_STA_MIN))
61 quirks |= WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED; 61 quirks |= WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED;
62 62
63 /* This feature is not yet supported for AP mode */ 63 /* This feature is not yet supported for AP mode */
64 if (fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP) 64 if (fw_ver[FW_VER_IF_TYPE] == FW_VER_IF_TYPE_AP)
65 quirks |= WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED; 65 quirks |= WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED;
66 66
67 return quirks; 67 return quirks;
68} 68}
@@ -641,7 +641,7 @@ static int wl127x_boot_clk(struct wl1271 *wl)
641 u32 clk; 641 u32 clk;
642 642
643 if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3) 643 if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
644 wl->quirks |= WL12XX_QUIRK_END_OF_TRANSACTION; 644 wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
645 645
646 if (wl->ref_clock == CONF_REF_CLK_19_2_E || 646 if (wl->ref_clock == CONF_REF_CLK_19_2_E ||
647 wl->ref_clock == CONF_REF_CLK_38_4_E || 647 wl->ref_clock == CONF_REF_CLK_38_4_E ||
diff --git a/drivers/net/wireless/ti/wlcore/init.c b/drivers/net/wireless/ti/wlcore/init.c
index f3b606798f14..c146d8ed3054 100644
--- a/drivers/net/wireless/ti/wlcore/init.c
+++ b/drivers/net/wireless/ti/wlcore/init.c
@@ -318,7 +318,7 @@ static int wl12xx_init_fwlog(struct wl1271 *wl)
318{ 318{
319 int ret; 319 int ret;
320 320
321 if (wl->quirks & WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED) 321 if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED)
322 return 0; 322 return 0;
323 323
324 ret = wl12xx_cmd_config_fwlog(wl); 324 ret = wl12xx_cmd_config_fwlog(wl);
@@ -500,7 +500,7 @@ int wl1271_chip_specific_init(struct wl1271 *wl)
500 if (wl->chip.id == CHIP_ID_1283_PG20) { 500 if (wl->chip.id == CHIP_ID_1283_PG20) {
501 u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE; 501 u32 host_cfg_bitmap = HOST_IF_CFG_RX_FIFO_ENABLE;
502 502
503 if (!(wl->quirks & WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT)) 503 if (!(wl->quirks & WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT))
504 /* Enable SDIO padding */ 504 /* Enable SDIO padding */
505 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK; 505 host_cfg_bitmap |= HOST_IF_CFG_TX_PAD_TO_SDIO_BLK;
506 506
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index d3fde0ac03c8..95d247198287 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -1055,10 +1055,7 @@ static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
1055 1055
1056 if (plt) { 1056 if (plt) {
1057 fw_type = WL12XX_FW_TYPE_PLT; 1057 fw_type = WL12XX_FW_TYPE_PLT;
1058 if (wl->chip.id == CHIP_ID_1283_PG20) 1058 fw_name = wl->plt_fw_name;
1059 fw_name = WL128X_PLT_FW_NAME;
1060 else
1061 fw_name = WL127X_PLT_FW_NAME;
1062 } else { 1059 } else {
1063 /* 1060 /*
1064 * we can't call wl12xx_get_vif_count() here because 1061 * we can't call wl12xx_get_vif_count() here because
@@ -1066,16 +1063,10 @@ static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
1066 */ 1063 */
1067 if (wl->last_vif_count > 1) { 1064 if (wl->last_vif_count > 1) {
1068 fw_type = WL12XX_FW_TYPE_MULTI; 1065 fw_type = WL12XX_FW_TYPE_MULTI;
1069 if (wl->chip.id == CHIP_ID_1283_PG20) 1066 fw_name = wl->mr_fw_name;
1070 fw_name = WL128X_FW_NAME_MULTI;
1071 else
1072 fw_name = WL127X_FW_NAME_MULTI;
1073 } else { 1067 } else {
1074 fw_type = WL12XX_FW_TYPE_NORMAL; 1068 fw_type = WL12XX_FW_TYPE_NORMAL;
1075 if (wl->chip.id == CHIP_ID_1283_PG20) 1069 fw_name = wl->sr_fw_name;
1076 fw_name = WL128X_FW_NAME_SINGLE;
1077 else
1078 fw_name = WL127X_FW_NAME_SINGLE;
1079 } 1070 }
1080 } 1071 }
1081 1072
@@ -1182,7 +1173,7 @@ static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
1182 u32 first_addr; 1173 u32 first_addr;
1183 u8 *block; 1174 u8 *block;
1184 1175
1185 if ((wl->quirks & WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED) || 1176 if ((wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED) ||
1186 (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) || 1177 (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) ||
1187 (wl->conf.fwlog.mem_blocks == 0)) 1178 (wl->conf.fwlog.mem_blocks == 0))
1188 return; 1179 return;
@@ -1356,43 +1347,17 @@ static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
1356 * chip types. 1347 * chip types.
1357 */ 1348 */
1358 if (!wl1271_set_block_size(wl)) 1349 if (!wl1271_set_block_size(wl))
1359 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT; 1350 wl->quirks |= WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1360
1361 switch (wl->chip.id) {
1362 case CHIP_ID_1271_PG10:
1363 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
1364 wl->chip.id);
1365 1351
1366 ret = wl1271_setup(wl); 1352 ret = wl->ops->identify_chip(wl);
1367 if (ret < 0) 1353 if (ret < 0)
1368 goto out; 1354 goto out;
1369 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1370 break;
1371
1372 case CHIP_ID_1271_PG20:
1373 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
1374 wl->chip.id);
1375
1376 ret = wl1271_setup(wl);
1377 if (ret < 0)
1378 goto out;
1379 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1380 break;
1381 1355
1382 case CHIP_ID_1283_PG20: 1356 /* TODO: make sure the lower driver has set things up correctly */
1383 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
1384 wl->chip.id);
1385 1357
1386 ret = wl1271_setup(wl); 1358 ret = wl1271_setup(wl);
1387 if (ret < 0) 1359 if (ret < 0)
1388 goto out;
1389 break;
1390 case CHIP_ID_1283_PG10:
1391 default:
1392 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
1393 ret = -ENODEV;
1394 goto out; 1360 goto out;
1395 }
1396 1361
1397 ret = wl12xx_fetch_firmware(wl, plt); 1362 ret = wl12xx_fetch_firmware(wl, plt);
1398 if (ret < 0) 1363 if (ret < 0)
diff --git a/drivers/net/wireless/ti/wlcore/rx.c b/drivers/net/wireless/ti/wlcore/rx.c
index d7fab4626a1d..71c8d7095059 100644
--- a/drivers/net/wireless/ti/wlcore/rx.c
+++ b/drivers/net/wireless/ti/wlcore/rx.c
@@ -282,7 +282,7 @@ void wl12xx_rx(struct wl1271 *wl, struct wl12xx_fw_status *status)
282 * Write the driver's packet counter to the FW. This is only required 282 * Write the driver's packet counter to the FW. This is only required
283 * for older hardware revisions 283 * for older hardware revisions
284 */ 284 */
285 if (wl->quirks & WL12XX_QUIRK_END_OF_TRANSACTION) 285 if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
286 wl1271_write32(wl, WL12XX_REG_RX_DRIVER_COUNTER, 286 wl1271_write32(wl, WL12XX_REG_RX_DRIVER_COUNTER,
287 wl->rx_counter); 287 wl->rx_counter);
288 288
diff --git a/drivers/net/wireless/ti/wlcore/tx.c b/drivers/net/wireless/ti/wlcore/tx.c
index 4e90c07d1ab5..176b9501309f 100644
--- a/drivers/net/wireless/ti/wlcore/tx.c
+++ b/drivers/net/wireless/ti/wlcore/tx.c
@@ -175,7 +175,7 @@ u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
175static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl, 175static unsigned int wl12xx_calc_packet_alignment(struct wl1271 *wl,
176 unsigned int packet_length) 176 unsigned int packet_length)
177{ 177{
178 if (wl->quirks & WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT) 178 if (wl->quirks & WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT)
179 return ALIGN(packet_length, WL1271_TX_ALIGN_TO); 179 return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
180 else 180 else
181 return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE); 181 return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
@@ -767,7 +767,7 @@ out_ack:
767 * Interrupt the firmware with the new packets. This is only 767 * Interrupt the firmware with the new packets. This is only
768 * required for older hardware revisions 768 * required for older hardware revisions
769 */ 769 */
770 if (wl->quirks & WL12XX_QUIRK_END_OF_TRANSACTION) 770 if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION)
771 wl1271_write32(wl, WL12XX_HOST_WR_ACCESS, 771 wl1271_write32(wl, WL12XX_HOST_WR_ACCESS,
772 wl->tx_packets_count); 772 wl->tx_packets_count);
773 773
diff --git a/drivers/net/wireless/ti/wlcore/wl12xx.h b/drivers/net/wireless/ti/wlcore/wl12xx.h
index c979920d964d..b4db4cc7443b 100644
--- a/drivers/net/wireless/ti/wlcore/wl12xx.h
+++ b/drivers/net/wireless/ti/wlcore/wl12xx.h
@@ -451,17 +451,6 @@ size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);
451#define HW_BG_RATES_MASK 0xffff 451#define HW_BG_RATES_MASK 0xffff
452#define HW_HT_RATES_OFFSET 16 452#define HW_HT_RATES_OFFSET 16
453 453
454/* Quirks */
455
456/* Each RX/TX transaction requires an end-of-transaction transfer */
457#define WL12XX_QUIRK_END_OF_TRANSACTION BIT(0)
458
459/* wl127x and SPI don't support SDIO block size alignment */
460#define WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT BIT(2)
461
462/* Older firmwares did not implement the FW logger over bus feature */
463#define WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED BIT(4)
464
465#define WL12XX_HW_BLOCK_SIZE 256 454#define WL12XX_HW_BLOCK_SIZE 256
466 455
467#endif 456#endif
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
index f11e5c6de51f..92455e91b79d 100644
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
@@ -28,6 +28,7 @@
28#include "event.h" 28#include "event.h"
29 29
30struct wlcore_ops { 30struct wlcore_ops {
31 int (*identify_chip)(struct wl1271 *wl);
31}; 32};
32 33
33enum wlcore_partitions { 34enum wlcore_partitions {
@@ -291,6 +292,10 @@ struct wl1271 {
291 const struct wlcore_partition_set *ptable; 292 const struct wlcore_partition_set *ptable;
292 /* pointer to the lower driver register table */ 293 /* pointer to the lower driver register table */
293 const int *rtable; 294 const int *rtable;
295 /* name of the firmwares to load - for PLT, single role, multi-role */
296 const char *plt_fw_name;
297 const char *sr_fw_name;
298 const char *mr_fw_name;
294}; 299};
295 300
296int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev); 301int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
@@ -301,6 +306,17 @@ int wlcore_free_hw(struct wl1271 *wl);
301/* Firmware image load chunk size */ 306/* Firmware image load chunk size */
302#define CHUNK_SIZE 16384 307#define CHUNK_SIZE 16384
303 308
309/* Quirks */
310
311/* Each RX/TX transaction requires an end-of-transaction transfer */
312#define WLCORE_QUIRK_END_OF_TRANSACTION BIT(0)
313
314/* wl127x and SPI don't support SDIO block size alignment */
315#define WLCORE_QUIRK_NO_BLOCKSIZE_ALIGNMENT BIT(2)
316
317/* Older firmwares did not implement the FW logger over bus feature */
318#define WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED BIT(4)
319
304/* TODO: move to the lower drivers when all usages are abstracted */ 320/* TODO: move to the lower drivers when all usages are abstracted */
305#define CHIP_ID_1271_PG10 (0x4030101) 321#define CHIP_ID_1271_PG10 (0x4030101)
306#define CHIP_ID_1271_PG20 (0x4030111) 322#define CHIP_ID_1271_PG20 (0x4030111)
@@ -381,4 +397,6 @@ int wlcore_free_hw(struct wl1271 *wl);
381 397
382#define ECPU_CONTROL_HALT 0x00000101 398#define ECPU_CONTROL_HALT 0x00000101
383 399
400#define WELP_ARM_COMMAND_VAL 0x4
401
384#endif /* __WLCORE_H__ */ 402#endif /* __WLCORE_H__ */