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