#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);