r3631 - developers/sameo/patches/ar6k-ng
sameo at sita.openmoko.org
sameo at sita.openmoko.org
Tue Dec 11 21:57:56 CET 2007
Author: sameo
Date: 2007-12-11 21:57:55 +0100 (Tue, 11 Dec 2007)
New Revision: 3631
Modified:
developers/sameo/patches/ar6k-ng/160-ar6k_ng.patch
Log:
ar6k-ng: Almost done with the mainline SDIO stack conversion.
htc_send.c is left.
Modified: developers/sameo/patches/ar6k-ng/160-ar6k_ng.patch
===================================================================
--- developers/sameo/patches/ar6k-ng/160-ar6k_ng.patch 2007-12-11 16:11:57 UTC (rev 3630)
+++ developers/sameo/patches/ar6k-ng/160-ar6k_ng.patch 2007-12-11 20:57:55 UTC (rev 3631)
@@ -4,15 +4,15 @@
drivers/net/wireless/ar6k/Kconfig | 11
drivers/net/wireless/ar6k/Makefile | 19
drivers/net/wireless/ar6k/ar6k.h | 68
- drivers/net/wireless/ar6k/ar6k_main.c | 5574 +++++++++++++++++
- drivers/net/wireless/ar6k/bmi.c | 450 +
- drivers/net/wireless/ar6k/hif.c | 204
- drivers/net/wireless/ar6k/hif.h | 48
+ drivers/net/wireless/ar6k/ar6k_main.c | 5580 +++++++++++++++++
+ drivers/net/wireless/ar6k/bmi.c | 466 +
+ drivers/net/wireless/ar6k/hif.c | 287
+ drivers/net/wireless/ar6k/hif.h | 87
drivers/net/wireless/ar6k/htc/Makefile | 5
- drivers/net/wireless/ar6k/htc/htc.c | 426 +
- drivers/net/wireless/ar6k/htc/htc_events.c | 886 ++
+ drivers/net/wireless/ar6k/htc/htc.c | 445 +
+ drivers/net/wireless/ar6k/htc/htc_events.c | 934 ++
drivers/net/wireless/ar6k/htc/htc_internal.h | 456 +
- drivers/net/wireless/ar6k/htc/htc_recv.c | 197
+ drivers/net/wireless/ar6k/htc/htc_recv.c | 205
drivers/net/wireless/ar6k/htc/htc_send.c | 359 +
drivers/net/wireless/ar6k/htc/htc_utils.c | 394 +
drivers/net/wireless/ar6k/include/AR6000_bmi.h | 136
@@ -24,7 +24,7 @@
drivers/net/wireless/ar6k/include/athdrv.h | 597 +
drivers/net/wireless/ar6k/include/dset_api.h | 47
drivers/net/wireless/ar6k/include/gpio_api.h | 60
- drivers/net/wireless/ar6k/include/hif.h | 79
+ drivers/net/wireless/ar6k/include/hif.h | 75
drivers/net/wireless/ar6k/include/host_version.h | 47
drivers/net/wireless/ar6k/include/htc.h | 115
drivers/net/wireless/ar6k/include/hw/#mbox_host_reg.h# | 416 +
@@ -49,7 +49,7 @@
drivers/net/wireless/ar6k/wlan/wlan_recv_beacon.c | 169
drivers/net/wireless/ar6k/wlan/wlan_utils.c | 53
drivers/net/wireless/ar6k/wmi.c | 2834 ++++++++
- 50 files changed, 20491 insertions(+)
+ 50 files changed, 20706 insertions(+)
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/ar6k.h
===================================================================
@@ -127,8 +127,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/ar6k_main.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/ar6k_main.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,5574 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/ar6k_main.c 2007-12-11 18:52:33.000000000 +0100
+@@ -0,0 +1,5580 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ * Copyright (c) 2007 Felix Fietkau <nbd at openwrt.org>
@@ -567,15 +567,19 @@
+{
+ int ret;
+
-+ ret = sdio_memcpy_toio(func, WINDOW_DATA_ADDRESS, data, sizeof(u32));
++ ret = hif_rw(func, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ WINDOW_DATA_ADDRESS, (u8 *)data, sizeof(u32));
++// ret = sdio_memcpy_toio(func, WINDOW_DATA_ADDRESS, data, sizeof(u32));
+ if (ret) {
+ AR_DEBUG_PRINTF("Cannot write 0x%x to WINDOW_DATA_ADDRESS\n",
+ *data);
+ return A_ERROR;
+ }
+
-+ ret = sdio_memcpy_toio(func, WINDOW_WRITE_ADDR_ADDRESS + 1,
-+ ((u8 *) address) + 1, sizeof(u32) - 1);
++ ret = hif_rw(func, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ WINDOW_DATA_ADDRESS + 1, ((u8 *)(data)) + 1, sizeof(u32) - 1);
++// ret = sdio_memcpy_toio(func, WINDOW_WRITE_ADDR_ADDRESS + 1,
++// ((u8 *) address) + 1, sizeof(u32) - 1);
+ if (ret) {
+ AR_DEBUG_PRINTF
+ ("Cannot write initial bytes of 0x%x to WINDOW_WRITE_ADDR_ADDRESS\n",
@@ -583,9 +587,9 @@
+ return A_ERROR;
+ }
+
-+ ret =
-+ sdio_memcpy_toio(func, WINDOW_WRITE_ADDR_ADDRESS, (u8 *) address,
-+ 1);
++ ret = hif_rw(func, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ WINDOW_WRITE_ADDR_ADDRESS, (u8 *)data, sizeof(u32));
++// ret = sdio_memcpy_toio(func, WINDOW_WRITE_ADDR_ADDRESS, (u8 *) address, 1);
+ if (ret) {
+ AR_DEBUG_PRINTF("Cannot write 0x%x to WINDOW_WRITE_ADDR_ADDRESS\n",
+ *address);
@@ -2073,11 +2077,13 @@
+ return -EIO;
+ }
+
-+ copy_from_user(&qreq, rq->ifr_data, sizeof(struct ar6k_queuereq));
++ if (copy_from_user(&qreq, rq->ifr_data, sizeof(struct ar6k_queuereq))) {
++ return -EFAULT;
++ }
+
+ qreq.queueNumber = wmi_get_mapped_qos_queue(ar->arWmi,
-+ qreq.trafficDirection,
-+ qreq.trafficClass);
++ qreq.trafficDirection,
++ qreq.trafficClass);
+
+ if (copy_to_user(rq->ifr_data, &qreq, sizeof(struct ar6k_queuereq))) {
+ ret = -EFAULT;
@@ -3803,8 +3809,8 @@
+ */
+int
+ar6k_ioctl_giwfreq(struct net_device *dev,
-+ struct iw_request_info *info,
-+ struct iw_freq *freq, char *extra)
++ struct iw_request_info *info,
++ struct iw_freq *freq, char *extra)
+{
+ AR_SOFTC_T *ar = (AR_SOFTC_T *) dev->priv;
+
@@ -5706,8 +5712,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/bmi.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/bmi.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,450 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/bmi.c 2007-12-11 19:41:01.000000000 +0100
+@@ -0,0 +1,466 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ * Wireless Network driver for Atheros AR6001
@@ -6091,14 +6097,19 @@
+ u32 timeout;
+ u32 address;
+ u8 cmdCredits;
++ u32 mbox_address[HTC_MAILBOX_NUM_MAX];
+
++ HIFConfigureDevice(HIF_DEVICE_GET_MBOX_ADDR,
++ &mbox_address, sizeof(mbox_address));
++
+ cmdCredits = 0;
+ timeout = BMI_COMMUNICATION_TIMEOUT;
+ while (timeout-- && !cmdCredits) {
+ /* Read the counter register to get the command credits */
-+ address =
-+ COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
-+ cmdCredits = sdio_readb(func, address, &ret);
++ address = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
++ //cmdCredits = sdio_readb(func, address, &ret);
++ ret = hif_rw(func, HIF_READ, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &cmdCredits, 1);
+ if (ret) {
+ AR_DEBUG_PRINTF
+ ("Unable to decrement the command credit count register: %d\n",
@@ -6112,8 +6123,10 @@
+ return A_ERROR;
+ }
+
-+ address = HIF_MBOX_START_ADDR(ENDPOINT1);
-+ ret = sdio_memcpy_toio(func, address, buffer, length);
++ address = mbox_address[ENDPOINT1];
++ ret = hif_rw(func, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, buffer, length);
++// ret = sdio_memcpy_toio(func, address, buffer, length);
+ if (ret) {
+ AR_DEBUG_PRINTF("Unable to send the BMI data to the device: %d\n",
+ ret);
@@ -6129,13 +6142,19 @@
+ u32 address;
+ u32 timeout;
+ u8 cmdCredits;
++ u32 mbox_address[HTC_MAILBOX_NUM_MAX];
+
++ HIFConfigureDevice(HIF_DEVICE_GET_MBOX_ADDR,
++ &mbox_address, sizeof(mbox_address));
++
+ cmdCredits = 0;
+ timeout = BMI_COMMUNICATION_TIMEOUT;
+ while (timeout-- && !cmdCredits) {
+ /* Read the counter register to get the command credits */
+ address = COUNT_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 1;
-+ cmdCredits = sdio_readb(func, address, &ret);
++ ret = hif_rw(func, HIF_READ, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &cmdCredits, 1);
++// cmdCredits = sdio_readb(func, address, &ret);
+ if (ret) {
+ AR_DEBUG_PRINTF
+ ("Unable to decrement the command credit count register: %d\n",
@@ -6149,8 +6168,11 @@
+ return A_ERROR;
+ }
+
-+ address = HIF_MBOX_START_ADDR(ENDPOINT1);
-+ ret = sdio_memcpy_fromio(func, buffer, address, length);
++ address = mbox_address[ENDPOINT1];
++ ret = hif_rw(func, HIF_READ, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, buffer, length);
++// address = HIF_MBOX_START_ADDR(ENDPOINT1);
++// ret = sdio_memcpy_fromio(func, buffer, address, length);
+ if (ret) {
+ AR_DEBUG_PRINTF("Unable to read the BMI data from the device\n");
+ return A_ERROR;
@@ -6161,8 +6183,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,204 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.c 2007-12-11 19:36:51.000000000 +0100
+@@ -0,0 +1,287 @@
+/*
+ * Copyright (c) 2004-2005 Atheros Communications Inc.
+ *
@@ -6183,6 +6205,7 @@
+ */
+#include "ar6k.h"
+#include "hif.h"
++#include "include/wmi.h"
+
+/* ------ Static Variables ------ */
+
@@ -6367,19 +6390,104 @@
+ htcCallbacks.deviceRemovedHandler(func);
+}
+
++int
++HIFConfigureDevice(HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, u32 len)
++{
++ u32 count;
++
++ switch(opcode) {
++ case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
++ ((u32 *)config)[0] = HIF_MBOX0_BLOCK_SIZE;
++ ((u32 *)config)[1] = HIF_MBOX1_BLOCK_SIZE;
++ ((u32 *)config)[2] = HIF_MBOX2_BLOCK_SIZE;
++ ((u32 *)config)[3] = HIF_MBOX3_BLOCK_SIZE;
++ break;
++
++ case HIF_DEVICE_GET_MBOX_ADDR:
++ for (count = 0; count < 4; count ++) {
++ ((u32 *)config)[count] = HIF_MBOX_START_ADDR(count);
++ }
++ break;
++
++ default:
++ printk(KERN_ERR "Invalid configuration opcode: %d\n", opcode);
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++
++extern int sdio_io_rw(struct sdio_func *func, int write, int block, int block_size, int block_count,
++ unsigned addr, int incr_addr, u8 *buf, unsigned size);
++
++int hif_rw(struct sdio_func *func, u32 write, u32 incr_mode, u32 block_mode,
++ u32 address, u8 * buffer, u32 length)
++{
++ u32 block, block_size, block_count, rw, incr;
++
++ if (block_mode == HIF_BLOCK_BASIS) {
++ block = 1;
++ block_size = HIF_MBOX_BLOCK_SIZE;
++ block_count = length / HIF_MBOX_BLOCK_SIZE;
++ } else if (block_mode == HIF_BYTE_BASIS) {
++ block = 0;
++ block_size = length;
++ block_count = 1;
++ } else {
++ printk(KERN_ERR "Invalid block mode\n");
++ return -EINVAL;
++ }
++
++ if ((address >= HIF_MBOX_START_ADDR(0)) &&
++ (address <= HIF_MBOX_END_ADDR(3)))
++ {
++ /*
++ * Mailbox write. Adjust the address so that the last byte
++ * falls on the EOM address.
++ */
++ address += (HIF_MBOX_WIDTH - length);
++ }
++
++ if (write == HIF_WRITE)
++ rw = 1;
++ else if (write == HIF_READ)
++ rw = 0;
++ else {
++ printk(KERN_ERR "Invalid write mode\n");
++ return -EINVAL;
++ }
++
++ if (incr_mode == HIF_INCREMENTAL_ADDRESS)
++ incr = 1;
++ else if (incr_mode == HIF_FIXED_ADDRESS)
++ incr = 0;
++ else {
++ printk(KERN_ERR "Invalid increase mode\n");
++ return -EINVAL;
++ }
++
++
++ return sdio_io_rw(func, rw, block, block_size, block_count,
++ address, incr, buffer, length);
++}
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.h 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,48 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/hif.h 2007-12-11 19:53:56.000000000 +0100
+@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ * All rights reserved.
+ *
-+ $ATH_LICENSE_AR6K0$
++ * $ATH_LICENSE_AR6K0$
+ *
+ */
+
++#ifndef _HIF_H_
++#define _HIF_H_
++
+#include "include/athdefs.h"
+#include "include/osapi.h"
+#include "include/hif.h"
@@ -6405,26 +6513,62 @@
+#define HIF_MBOX2_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
+#define HIF_MBOX3_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
+
-+#define HIF_MBOX_START_ADDR(mbox) \
-+ HIF_MBOX_BASE_ADDR + mbox * HIF_MBOX_WIDTH
++#define HIF_MBOX_START_ADDR(mbox) (HIF_MBOX_BASE_ADDR + ((mbox) * HIF_MBOX_WIDTH))
+
-+#define HIF_MBOX_END_ADDR(mbox) \
-+ HIF_MBOX_START_ADDR(mbox) + HIF_MBOX_WIDTH - 1
++#define HIF_MBOX_END_ADDR(mbox) (HIF_MBOX_START_ADDR((mbox)) + HIF_MBOX_WIDTH - 1)
+
++typedef enum {
++ HIF_READ,
++ HIF_WRITE,
++} HIF_DIRECTION;
+
-+int
-+hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id *id);
++typedef enum {
++ HIF_BASIC_IO,
++ HIF_EXTENDED_IO,
++} HIF_CMDTYPE;
+
++typedef enum {
++ HIF_SYNCHRONOUS,
++ HIF_ASYNCHRONOUS,
++} HIF_EXECMODE;
++
++typedef enum {
++ HIF_BYTE_BASIS,
++ HIF_BLOCK_BASIS,
++} HIF_DATAMODE;
++
++typedef enum {
++ HIF_FIXED_ADDRESS,
++ HIF_INCREMENTAL_ADDRESS,
++} HIF_ADDRMODE;
++
++typedef enum {
++ HIF_DEVICE_POWER_STATE,
++ HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ HIF_DEVICE_GET_MBOX_ADDR,
++} HIF_DEVICE_CONFIG_OPCODE;
++
++int hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id *id);
++
+void hifDeviceRemoved(struct sdio_func *func);
+
+void hifRWCompletionHandler(struct mmc_request *mrq);
+
+void hifIRQHandler(struct sdio_func *func);
++
++int HIFConfigureDevice(HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, u32 len);
++
++
++int hif_rw(struct sdio_func *func, u32 write, u32 incr_mode, u32 block_mode,
++ u32 address, u8 * buffer, u32 length);
++
++#endif
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,426 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc.c 2007-12-11 21:04:28.000000000 +0100
+@@ -0,0 +1,445 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ * Copyright (c) 2007 Felix Fietkau <nbd at openwrt.org>
@@ -6537,9 +6681,11 @@
+
+ /* Write to the register */
+ address = getRegAddr(INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);
-+ status =
-+ sdio_memcpy_toio(target->device, address,
-+ &target->table.int_status_enable, 4);
++ status = hif_rw(target->device, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.int_status_enable, 4);
++// status =
++// sdio_memcpy_toio(target->device, address,
++// &target->table.int_status_enable, 4);
+ if (status) {
+ /* Can't write it for some reason */
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
@@ -6710,9 +6856,15 @@
+ window_addr = value;
+ address = getRegAddr(whichreg, ENDPOINT_UNUSED);
+
-+ sdio_memcpy_toio(target->device, address + 1,
-+ ((u8 *) & window_addr) + 1, 3);
-+ sdio_memcpy_toio(target->device, address, (u8 *) & window_addr, 1);
++ hif_rw(target->device, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address + 1, ((u8 *) &window_addr) + 1, 3);
++
++ hif_rw(target->device, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, ((u8 *) &window_addr), 1);
++
++// sdio_memcpy_toio(target->device, address + 1,
++// ((u8 *) & window_addr) + 1, 3);
++// sdio_memcpy_toio(target->device, address, (u8 *) & window_addr, 1);
+}
+
+void HTCStop(HTC_TARGET * target)
@@ -6736,8 +6888,11 @@
+ target->table.counter_int_status_enable = 0;
+
+ address = getRegAddr(INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);
-+ sdio_writel(target->device, target->table.int_status_enable, address,
-+ &status);
++ status = hif_rw(target->device, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.int_status_enable, 4);
++
++// sdio_writel(target->device, target->table.int_status_enable, address,
++// &status);
+ AR_DEBUG_ASSERT(status == 0);
+
+ /* Disable the host controller interrupts */
@@ -6750,10 +6905,13 @@
+ /* Decrement the number of credits consumed */
+ if (endPoint->txCreditsConsumed) {
+ address = getRegAddr(TX_CREDIT_COUNTER_DECREMENT_REG, count);
-+ status =
-+ sdio_writesb(target->device, address,
-+ endPoint->txCreditsAvailable,
-+ endPoint->txCreditsConsumed);
++
++ status = hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, endPoint->txCreditsAvailable, endPoint->txCreditsConsumed);
++// status =
++// sdio_writesb(target->device, address,
++// endPoint->txCreditsAvailable,
++// endPoint->txCreditsConsumed);
+ AR_DEBUG_ASSERT(status == 0);
+ }
+
@@ -6791,7 +6949,11 @@
+ /* Attempting a force reset of the target */
+ window_data = RESET_CONTROL_COLD_RST_MASK;
+ address = getRegAddr(WINDOW_DATA_REG, ENDPOINT_UNUSED);
-+ sdio_writel(target->device, window_data, address, &status);
++
++ status = hif_rw(target->device, HIF_WRITE, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, (u8 *)&window_data, 4);
++
++//sdio_writel(target->device, window_data, address, &status);
+ AR_DEBUG_ASSERT(status == 0);
+
+ _WRITE_WINDOW_ADDR(target, WINDOW_WRITE_ADDR_REG,
@@ -6807,7 +6969,8 @@
+
+ window_data = 0;
+ address = getRegAddr(WINDOW_DATA_REG, ENDPOINT_UNUSED);
-+ sdio_writel(target->device, window_data, address, &status);
++
++// sdio_writel(target->device, window_data, address, &status);
+ AR_DEBUG_ASSERT(status == 0);
+
+ AR_DEBUG_PRINTF(ATH_DEBUG_INF, ("window data: %d\n", window_data));
@@ -6854,8 +7017,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_events.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_events.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,886 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_events.c 2007-12-11 21:46:34.000000000 +0100
+@@ -0,0 +1,934 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ *
@@ -7021,11 +7184,15 @@
+ /* Send the INT_WLAN interrupt to the target */
+ target->table.int_wlan = 1;
+ regElement = allocateRegRequestElement(target);
++ AR_DEBUG_ASSERT(regElement != NULL);
++ FILL_REG_BUFFER(regElement, &target->table.int_wlan, 1,
++ INT_WLAN_REG, ENDPOINT_UNUSED);
+ address = getRegAddr(INT_WLAN_REG, ENDPOINT_UNUSED);
+
-+ /* FIXME: do an async request here */
-+ sdio_writeb(target->device, target->table.int_wlan, address,
-+ &status);
++ hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.int_wlan, 1);
++// sdio_writeb(target->device, target->table.int_wlan, address,
++// &status);
+ if (status == 0)
+ regElement->completionCB(regElement, status);
+ }
@@ -7404,9 +7571,11 @@
+ * sizeof(counter_int_status_enable);
+ */
+ address = getRegAddr(INT_STATUS_REG, ENDPOINT_UNUSED);
-+ status =
-+ sdio_memcpy_fromio(target->device, &target->table.host_int_status,
-+ address, 28);
++ status = hif_rw(target->device, HIF_READ, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.host_int_status, 28);
++// status =
++// sdio_memcpy_fromio(target->device, &target->table.host_int_status,
++// address, 28);
+ AR_DEBUG_ASSERT(status == 0);
+
+#ifdef CONFIG_AR6K_DEBUG
@@ -7471,8 +7640,10 @@
+ /* Clear the interrupt */
+ target->table.cpu_int_status = cpu_int_status; /* W1C */
+ address = getRegAddr(CPU_INT_STATUS_REG, ENDPOINT_UNUSED);
-+ sdio_writeb(target->device, target->table.cpu_int_status, address,
-+ &status);
++ status = hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.cpu_int_status, 1);
++// sdio_writeb(target->device, target->table.cpu_int_status, address,
++// &status);
+ AR_DEBUG_ASSERT(status == 0);
+}
+
@@ -7509,8 +7680,10 @@
+ /* Clear the interrupt */
+ target->table.error_int_status = error_int_status; /* W1C */
+ address = getRegAddr(ERROR_INT_STATUS_REG, ENDPOINT_UNUSED);
-+ sdio_writeb(target->device, target->table.error_int_status, address,
-+ &status);
++ status = hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.error_int_status, 1);
++// sdio_writeb(target->device, target->table.error_int_status, address,
++// &status);
+ AR_DEBUG_ASSERT(status == 0);
+}
+
@@ -7552,10 +7725,13 @@
+ element = allocateRegRequestElement(target);
+ AR_DEBUG_ASSERT(element != NULL);
+ FILL_REG_BUFFER(element, &endPoint->txCreditsAvailable[1], 1,
-+ TX_CREDIT_COUNTER_RESET_REG, endPointId);
++ TX_CREDIT_COUNTER_RESET_REG, endPointId);
++ status = hif_rw(target->device, HIF_READ, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, &endPoint->txCreditsAvailable[1], 1);
++
+ /* FIXME: async request? */
-+ sdio_writeb(target->device, endPoint->txCreditsAvailable[1],
-+ address, &status);
++// sdio_writeb(target->device, endPoint->txCreditsAvailable[1],
++// address, &status);
+ if (status == 0) {
+ /* Enable the Tx credit counter interrupt so that we can get
+ the credits posted by the target */
@@ -7609,6 +7785,7 @@
+ int status;
+ u32 address;
+ HTC_ENDPOINT *endPoint;
++ HTC_REG_REQUEST_ELEMENT *element;
+
+ endPoint = &target->endPoint[endPointId];
+ AR_DEBUG_ASSERT(endPoint != NULL);
@@ -7619,19 +7796,30 @@
+ address = getRegAddr(COUNTER_INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);
+
+ /* FIXME: async request? */
-+ sdio_writeb(target->device, ((target->endPoint[0].
-+ txCreditsIntrEnable << (4)) | (target->
-+ endPoint
-+ [1].
-+ txCreditsIntrEnable
-+ << (5)) |
-+ (target->endPoint[2].
-+ txCreditsIntrEnable << (6)) | (target->
-+ endPoint
-+ [3].
-+ txCreditsIntrEnable
-+ << (7)) |
-+ 0x0F), address, &status);
++ element = allocateRegRequestElement(target);
++ AR_DEBUG_ASSERT(element != NULL);
++ FILL_REG_BUFFER(element, NULL, 1, COUNTER_INT_STATUS_ENABLE_REG,
++ (target->endPoint[0].txCreditsIntrEnable << (4)) |
++ (target->endPoint[1].txCreditsIntrEnable << (5)) |
++ (target->endPoint[2].txCreditsIntrEnable << (6)) |
++ (target->endPoint[3].txCreditsIntrEnable << (7)) | 0x0F);
++
++
++ status = hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, (u8 *)&((GET_REG_BUFFER(element))->offset), 1);
++
++ AR_DEBUG_ASSERT(status == 0);
++ if(status == 0) {
++ element->completionCB(element, status);
++ }
++#if 0
++ sdio_writeb(target->device, ((target->endPoint[0].txCreditsIntrEnable << (4)) |
++ (target->endPoint[1].txCreditsIntrEnable << (5)) |
++ (target->endPoint[2].txCreditsIntrEnable << (6)) |
++ (target->endPoint[3].txCreditsIntrEnable << (7)) |
++ 0x0F),
++ address, &status);
++#endif
+ A_MUTEX_UNLOCK(&counterCS);
+}
+
@@ -7643,6 +7831,7 @@
+ u32 address;
+ HTC_ENDPOINT *endPoint;
+ HTC_ENDPOINT_ID endPointId;
++ HTC_REG_REQUEST_ELEMENT *element;
+ u8 counter_int_status;
+ u8 update_credit_int_status;
+
@@ -7671,6 +7860,23 @@
+
+ address = getRegAddr(COUNTER_INT_STATUS_DISABLE_REG, ENDPOINT_UNUSED);
+ /* FIXME: async request? */
++ element = allocateRegRequestElement(target);
++ AR_DEBUG_ASSERT(element != NULL);
++ FILL_REG_BUFFER(element, NULL, 1,
++ COUNTER_INT_STATUS_DISABLE_REG,
++ (target->endPoint[0].txCreditsIntrEnable << (4)) |
++ (target->endPoint[1].txCreditsIntrEnable << (5)) |
++ (target->endPoint[2].txCreditsIntrEnable << (6)) |
++ (target->endPoint[3].txCreditsIntrEnable << (7)) | 0x0F);
++
++ status = hif_rw(target->device, HIF_WRITE, HIF_FIXED_ADDRESS, HIF_BYTE_BASIS,
++ address, (u8 *)&((GET_REG_BUFFER(element))->offset), 1);
++
++ AR_DEBUG_ASSERT(status == 0);
++ if(status == 0) {
++ element->completionCB(element, status);
++ }
++#if 0
+ sdio_writeb(target->device, ((target->endPoint[0].
+ txCreditsIntrEnable << (4)) | (target->endPoint
+ [1].
@@ -7684,6 +7890,7 @@
+ txCreditsIntrEnable
+ << (7)) |
+ 0x0F), address, &status);
++#endif
+ A_MUTEX_UNLOCK(&counterCS);
+}
+
@@ -7730,11 +7937,15 @@
+ * by the bus driver.
+ */
+ address = getRegAddr(INT_STATUS_REG, ENDPOINT_UNUSED);
-+ status =
-+ sdio_memcpy_fromio(target->device,
-+ &target->table.host_int_status, address,
-+ 24);
-+// AR_DEBUG_ASSERT(status == 0);
++
++ status = hif_rw(target->device, HIF_READ, HIF_INCREMENTAL_ADDRESS, HIF_BYTE_BASIS,
++ address, &target->table.host_int_status, 24);
++
++// status =
++// sdio_memcpy_fromio(target->device,
++// &target->table.host_int_status, address,
++// 24);
++ AR_DEBUG_ASSERT(status == 0);
+ mailbox_int_status = target->table.host_int_status &
+ HOST_INT_STATUS_MBOX_DATA_MASK;
+ counter--;
@@ -8206,8 +8417,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_recv.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_recv.c 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,197 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/htc/htc_recv.c 2007-12-11 21:54:22.000000000 +0100
+@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ *
@@ -8291,6 +8502,7 @@
+ int status;
+ u32 paddedLength;
+ u32 frameLength;
++ u32 block_mode;
+ HTC_ENDPOINT_ID endPointId;
+ HTC_QUEUE_ELEMENT *element;
+ HTC_MBOX_BUFFER *mboxBuffer;
@@ -8343,7 +8555,7 @@
+ AR_DEBUG_ASSERT((frameLength > 0) &&
+ (frameLength <= HTC_MESSAGE_SIZE_MAX));
+ AR_DEBUG_PRINTF(ATH_DEBUG_INF | ATH_DEBUG_RECV, ("Frame Length: %d\n",
-+ frameLength));
++ frameLength));
+
+ /* Adjust the length to be a multiple of block size if appropriate */
+ paddedLength = (frameLength + (endPoint->blockSize - 1)) &
@@ -8356,32 +8568,39 @@
+ element = removeFromMboxQueue(recvQueue);
+ mboxBuffer = GET_MBOX_BUFFER(element);
+ mboxBuffer->actualLength = paddedLength;
++ block_mode = (endPoint->blockSize > 1) ? HIF_BLOCK_BASIS : HIF_BYTE_BASIS;
+
+ /* FIXME: async request */
-+ status = sdio_memcpy_fromio(target->device, mboxBuffer->buffer,
-+ endPoint->address,
-+ mboxBuffer->actualLength);
++ status = hif_rw(target->device, HIF_READ, HIF_INCREMENTAL_ADDRESS, block_mode,
++ endPoint->address, mboxBuffer->buffer, mboxBuffer->actualLength);
+
++// status = sdio_memcpy_fromio(target->device, mboxBuffer->buffer,
++// endPoint->address,
++// mboxBuffer->actualLength);
++
+ if (status) {
+ AR_DEBUG_PRINTF(ATH_DEBUG_ERR | ATH_DEBUG_RECV,
+ ("Frame reception failed\n"));
+ if (!IS_ELEMENT_FREE(element)) {
+ mboxBuffer->actualLength = 0;
+ FRAME_EVENT(eventInfo, mboxBuffer->buffer,
-+ mboxBuffer->bufferLength, mboxBuffer->actualLength,
-+ A_ECANCELED, mboxBuffer->cookie);
++ mboxBuffer->bufferLength, mboxBuffer->actualLength,
++ A_ECANCELED, mboxBuffer->cookie);
+ RECYCLE_DATA_REQUEST_ELEMENT(element);
+ dispatchEvent(target, endPointId, HTC_BUFFER_RECEIVED,
-+ &eventInfo);
++ &eventInfo);
+ AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_RECV,
-+ ("htcReceiveFrame - Exit\n"));
++ ("htcReceiveFrame - Exit\n"));
+ }
++
+ return;
+ }
++
+ if (element->completionCB)
+ element->completionCB(element, status);
++
+ AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_RECV,
-+ ("htcReceiveFrame - Exit\n"));
++ ("htcReceiveFrame - Exit\n"));
+}
+
+u32 htcGetFrameLength(HTC_ENDPOINT * endPoint)
@@ -10390,8 +10609,8 @@
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/include/hif.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/include/hif.h 2007-12-11 02:30:20.000000000 +0100
-@@ -0,0 +1,79 @@
++++ linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/include/hif.h 2007-12-11 18:05:40.000000000 +0100
+@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2004-2006 Atheros Communications Inc.
+ *
@@ -10410,8 +10629,8 @@
+ * HIF specific declarations and prototypes
+ */
+
-+#ifndef _HIF_H_
-+#define _HIF_H_
++#ifndef _INCLUDE_HIF_H_
++#define _INCLUDE_HIF_H_
+
+/* Header files */
+#include "../include/athdefs.h"
@@ -10430,10 +10649,6 @@
+ int (*deviceResumeHandler) (struct sdio_func * func);
+ int (*deviceWakeupHandler) (struct sdio_func * func);
+ int (*rwCompletionHandler) (void *context, int status);
-+#ifdef CF
-+ int (*deviceInterruptDisabler) (struct sdio_func * func, u8 * callDsr);
-+ int (*deviceInterruptEnabler) (struct sdio_func * func);
-+#endif /* CF */
+ int (*dsrHandler) (struct sdio_func * func);
+};
+
@@ -10470,7 +10685,7 @@
+int
+ HIFUnMaskInterrupt(struct sdio_func *func);
+
-+#endif /* _HIF_H_ */
++#endif /* _INCLUDE_HIF_H_ */
Index: linux-2.6.22-atheros-ng/drivers/net/wireless/ar6k/include/host_version.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
More information about the commitlog
mailing list