#define ATH6KL_MAX_ENDPOINTS 4
#define MAX_NODE_NUM 15
+/* Extra bytes for htc header alignment */
+#define ATH6KL_HTC_ALIGN_BYTES 3
+
/* MAX_HI_COOKIE_NUM are reserved for high priority traffic */
#define MAX_DEF_COOKIE_NUM 180
#define MAX_HI_COOKIE_NUM 18 /* 10% of MAX_COOKIE_NUM */
return mmc_wait_for_cmd(card->host, &io_cmd, 0);
}
+static void ath6kl_sdio_buf_align(u8 **buf, unsigned long len)
+{
+ u8 *align_addr;
+
+ if (!IS_ALIGNED((unsigned long) *buf, 4)) {
+ align_addr = PTR_ALIGN(*buf - 4, 4);
+ memmove(align_addr, *buf, len);
+ *buf = align_addr;
+ }
+}
+
static int ath6kl_sdio_io(struct sdio_func *func, u32 request, u32 addr,
u8 *buf, u32 len)
{
/* assemble SG list */
for (i = 0; i < scat_req->scat_entries; i++, sg++) {
- if ((unsigned long)scat_req->scat_list[i].buf & 0x3)
- /*
- * Some scatter engines can handle unaligned
- * buffers, print this as informational only.
- */
- ath6kl_dbg(ATH6KL_DBG_SCATTER,
- "(%s) scatter buffer is unaligned 0x%p\n",
- scat_req->req & HIF_WRITE ? "WR" : "RD",
- scat_req->scat_list[i].buf);
-
+ /* No header is added to rx buf, so it shoule be aligned */
+ if (data->flags == MMC_DATA_WRITE)
+ ath6kl_sdio_buf_align(&scat_req->scat_list[i].buf,
+ scat_req->scat_list[i].len);
ath6kl_dbg(ATH6KL_DBG_SCATTER, "%d: addr:0x%p, len:%d\n",
i, scat_req->scat_list[i].buf,
scat_req->scat_list[i].len);
break;
packet = (struct htc_packet *) skb->head;
+ skb->data = PTR_ALIGN(skb->data - 4, 4);
set_htc_rxpkt_info(packet, skb, skb->data,
ATH6KL_BUFFER_SIZE, endpoint);
list_add_tail(&packet->list, &queue);
return;
packet = (struct htc_packet *) skb->head;
+ skb->data = PTR_ALIGN(skb->data - 4, 4);
set_htc_rxpkt_info(packet, skb, skb->data,
ATH6KL_AMSDU_BUFFER_SIZE, 0);
spin_lock_bh(&ar->lock);