Index: chromeos/drivers/ath6kl/bmi/src/bmi.c |
diff --git a/chromeos/drivers/ath6kl/bmi/src/bmi.c b/chromeos/drivers/ath6kl/bmi/src/bmi.c |
index 0004508e8f09c03f98f6a6d26cc546a19e761555..f17f5636f5b212326d1d552450c21448a7aecba1 100644 |
--- a/chromeos/drivers/ath6kl/bmi/src/bmi.c |
+++ b/chromeos/drivers/ath6kl/bmi/src/bmi.c |
@@ -1,15 +1,19 @@ |
//------------------------------------------------------------------------------ |
// <copyright file="bmi.c" company="Atheros"> |
-// Copyright (c) 2004-2008 Atheros Corporation. All rights reserved. |
+// Copyright (c) 2004-2010 Atheros Corporation. All rights reserved. |
// |
-// This program is free software; you can redistribute it and/or modify |
-// it under the terms of the GNU General Public License version 2 as |
-// published by the Free Software Foundation; |
// |
-// Software distributed under the License is distributed on an "AS |
-// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
-// implied. See the License for the specific language governing |
-// rights and limitations under the License. |
+// Permission to use, copy, modify, and/or distribute this software for any |
+// purpose with or without fee is hereby granted, provided that the above |
+// copyright notice and this permission notice appear in all copies. |
+// |
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
// |
// |
//------------------------------------------------------------------------------ |
@@ -19,12 +23,16 @@ |
//============================================================================== |
+#ifdef THREAD_X |
+#include <string.h> |
+#endif |
+ |
#include "hif.h" |
#include "bmi.h" |
#include "htc_api.h" |
#include "bmi_internal.h" |
-#ifdef DEBUG |
+#ifdef ATH_DEBUG_MODULE |
static ATH_DEBUG_MASK_DESCRIPTION bmi_debug_desc[] = { |
{ ATH_DEBUG_BMI , "BMI Tracing"}, |
}; |
@@ -83,6 +91,20 @@ BMIInit(void) |
A_REGISTER_MODULE_DEBUG_INFO(bmi); |
} |
+void |
+BMICleanup(void) |
+{ |
+ if (pBMICmdCredits) { |
+ A_FREE(pBMICmdCredits); |
+ pBMICmdCredits = NULL; |
+ } |
+ |
+ if (pBMICmdBuf) { |
+ A_FREE(pBMICmdBuf); |
+ pBMICmdBuf = NULL; |
+ } |
+} |
+ |
A_STATUS |
BMIDone(HIF_DEVICE *device) |
{ |
@@ -170,14 +192,6 @@ BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info) |
targ_info->target_info_byte_count)); |
return A_ERROR; |
} |
- } else { |
- /* |
- * Target must be an AR6001 whose firmware does not |
- * support BMI_GET_TARGET_INFO. Construct the data |
- * that it would have sent. |
- */ |
- targ_info->target_info_byte_count=sizeof(*targ_info); |
- targ_info->target_type=TARGET_TYPE_AR6001; |
} |
AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n", |
@@ -253,7 +267,9 @@ BMIWriteMemory(HIF_DEVICE *device, |
A_UINT32 offset; |
A_UINT32 remaining, txlen; |
const A_UINT32 header = sizeof(cid) + sizeof(address) + sizeof(length); |
- |
+ A_UCHAR alignedBuffer[BMI_DATASZ_MAX]; |
+ A_UCHAR *src; |
+ |
A_ASSERT(BMI_COMMAND_FITS(BMI_DATASZ_MAX + header)); |
memset (pBMICmdBuf, 0, BMI_DATASZ_MAX + header); |
@@ -271,8 +287,18 @@ BMIWriteMemory(HIF_DEVICE *device, |
remaining = length; |
while (remaining) |
{ |
- txlen = (remaining < (BMI_DATASZ_MAX - header)) ? |
- remaining : (BMI_DATASZ_MAX - header); |
+ src = &buffer[length - remaining]; |
+ if (remaining < (BMI_DATASZ_MAX - header)) { |
+ if (remaining & 3) { |
+ /* align it with 4 bytes */ |
+ remaining = remaining + (4 - (remaining & 3)); |
+ memcpy(alignedBuffer, src, remaining); |
+ src = alignedBuffer; |
+ } |
+ txlen = remaining; |
+ } else { |
+ txlen = (BMI_DATASZ_MAX - header); |
+ } |
offset = 0; |
A_MEMCPY(&(pBMICmdBuf[offset]), &cid, sizeof(cid)); |
offset += sizeof(cid); |
@@ -280,7 +306,7 @@ BMIWriteMemory(HIF_DEVICE *device, |
offset += sizeof(address); |
A_MEMCPY(&(pBMICmdBuf[offset]), &txlen, sizeof(txlen)); |
offset += sizeof(txlen); |
- A_MEMCPY(&(pBMICmdBuf[offset]), &buffer[length - remaining], txlen); |
+ A_MEMCPY(&(pBMICmdBuf[offset]), src, txlen); |
offset += txlen; |
status = bmiBufferSend(device, pBMICmdBuf, offset); |
if (status != A_OK) { |