summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>2011-07-16 20:29:17 +0530
committerKalle Valo <kvalo@qca.qualcomm.com>2011-08-09 19:45:20 +0300
commit348a8fbce79e15b1918390120c0d63baa85343a0 (patch)
tree5bfbd3aaa86c93a076f6790a282ab7df2029ac93 /drivers
parentda220695f03a81fc8f6fcf1921e2b6f1c2be6db6 (diff)
downloadblackbird-op-linux-348a8fbce79e15b1918390120c0d63baa85343a0.tar.gz
blackbird-op-linux-348a8fbce79e15b1918390120c0d63baa85343a0.zip
ath6kl: Merge scatter rw request functions into one
Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath/ath6kl/htc_hif.c99
-rw-r--r--drivers/net/wireless/ath/ath6kl/htc_hif.h2
-rw-r--r--drivers/net/wireless/ath/ath6kl/sdio.c15
3 files changed, 15 insertions, 101 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/htc_hif.c b/drivers/net/wireless/ath/ath6kl/htc_hif.c
index 44bee90bc9a6..c5fb78b429bc 100644
--- a/drivers/net/wireless/ath/ath6kl/htc_hif.c
+++ b/drivers/net/wireless/ath/ath6kl/htc_hif.c
@@ -24,29 +24,6 @@
#define ATH6KL_TIME_QUANTUM 10 /* in ms */
-static void ath6kl_add_io_pkt(struct ath6kl_device *dev,
- struct htc_packet *packet)
-{
- spin_lock_bh(&dev->lock);
- list_add_tail(&packet->list, &dev->reg_io);
- spin_unlock_bh(&dev->lock);
-}
-
-static struct htc_packet *ath6kl_get_io_pkt(struct ath6kl_device *dev)
-{
- struct htc_packet *packet = NULL;
-
- spin_lock_bh(&dev->lock);
- if (!list_empty(&dev->reg_io)) {
- packet = list_first_entry(&dev->reg_io,
- struct htc_packet, list);
- list_del(&packet->list);
- }
- spin_unlock_bh(&dev->lock);
-
- return packet;
-}
-
static int ath6kldev_cp_scat_dma_buf(struct hif_scatter_req *req, bool from_dma)
{
u8 *buf;
@@ -191,65 +168,6 @@ int ath6kldev_rx_control(struct ath6kl_device *dev, bool enable_rx)
return status;
}
-static void ath6kldev_rw_async_handler(struct htc_target *target,
- struct htc_packet *packet)
-{
- struct ath6kl_device *dev = target->dev;
- struct hif_scatter_req *req = packet->pkt_cntxt;
-
- req->status = packet->status;
-
- ath6kl_add_io_pkt(dev, packet);
-
- req->complete(target, req);
-}
-
-static int ath6kldev_rw_scatter(struct ath6kl *ar, struct hif_scatter_req *req)
-{
- struct ath6kl_device *dev = ar->htc_target->dev;
- struct htc_packet *packet = NULL;
- int status = 0;
- u32 request = req->req;
- u8 *virt_dma_buf;
-
- if (!req->len)
- return 0;
-
- if (request & HIF_ASYNCHRONOUS) {
- /* use an I/O packet to carry this request */
- packet = ath6kl_get_io_pkt(dev);
- if (!packet) {
- status = -ENOMEM;
- goto out;
- }
-
- packet->pkt_cntxt = req;
- packet->completion = ath6kldev_rw_async_handler;
- packet->context = ar->htc_target;
- }
-
- virt_dma_buf = req->virt_dma_buf;
-
- if (request & HIF_ASYNCHRONOUS)
- status = hif_write_async(dev->ar, req->addr, virt_dma_buf,
- req->len, request, packet);
- else
- status = hif_read_write_sync(dev->ar, req->addr, virt_dma_buf,
- req->len, request);
-
-out:
- if (status)
- if (request & HIF_ASYNCHRONOUS) {
- if (packet != NULL)
- ath6kl_add_io_pkt(dev, packet);
- req->status = status;
- req->complete(ar->htc_target, req);
- status = 0;
- }
-
- return status;
-}
-
int ath6kldev_submit_scat_req(struct ath6kl_device *dev,
struct hif_scatter_req *scat_req, bool read)
{
@@ -285,10 +203,7 @@ int ath6kldev_submit_scat_req(struct ath6kl_device *dev,
return status;
}
- if (scat_req->virt_scat)
- status = ath6kldev_rw_scatter(dev->ar, scat_req);
- else
- status = ath6kl_hif_scat_req_rw(dev->ar, scat_req);
+ status = ath6kl_hif_scat_req_rw(dev->ar, scat_req);
if (read) {
/* in sync mode, we can touch the scatter request */
@@ -699,21 +614,9 @@ int ath6kldev_mask_intrs(struct ath6kl_device *dev)
int ath6kldev_setup(struct ath6kl_device *dev)
{
int status = 0;
- int i;
- struct htc_packet *packet;
- /* initialize our free list of IO packets */
- INIT_LIST_HEAD(&dev->reg_io);
spin_lock_init(&dev->lock);
- /* carve up register I/O packets (these are for ASYNC register I/O ) */
- for (i = 0; i < ATH6KL_MAX_REG_IO_BUFFERS; i++) {
- packet = &dev->reg_io_buf[i].packet;
- set_htc_rxpkt_info(packet, dev, dev->reg_io_buf[i].buf,
- ATH6KL_REG_IO_BUFFER_SIZE, 0);
- ath6kl_add_io_pkt(dev, packet);
- }
-
/*
* NOTE: we actually get the block size of a mailbox other than 0,
* for SDIO the block size on mailbox 0 is artificially set to 1.
diff --git a/drivers/net/wireless/ath/ath6kl/htc_hif.h b/drivers/net/wireless/ath/ath6kl/htc_hif.h
index 3514c22f7218..4cab5fbf1299 100644
--- a/drivers/net/wireless/ath/ath6kl/htc_hif.h
+++ b/drivers/net/wireless/ath/ath6kl/htc_hif.h
@@ -82,8 +82,6 @@ struct ath6kl_device {
u32 block_sz;
u32 block_mask;
struct htc_target *htc_cnxt;
- struct list_head reg_io;
- struct ath6kl_async_reg_io_buffer reg_io_buf[ATH6KL_MAX_REG_IO_BUFFERS];
int (*msg_pending) (struct htc_target *target, u32 lk_ahds[],
int *npkts_fetched);
struct hif_dev_scat_sup_info hif_scat_info;
diff --git a/drivers/net/wireless/ath/ath6kl/sdio.c b/drivers/net/wireless/ath/ath6kl/sdio.c
index 6c66613d6b45..44ac68e33b7c 100644
--- a/drivers/net/wireless/ath/ath6kl/sdio.c
+++ b/drivers/net/wireless/ath/ath6kl/sdio.c
@@ -244,10 +244,21 @@ static int ath6kl_sdio_scat_rw(struct ath6kl_sdio *ar_sdio,
struct mmc_data data;
struct hif_scatter_req *scat_req;
u8 opcode, rw;
- int status;
+ int status, len;
scat_req = req->scat_req;
+ if (scat_req->virt_scat) {
+ len = scat_req->len;
+ if (scat_req->req & HIF_BLOCK_BASIS)
+ len = round_down(len, HIF_MBOX_BLOCK_SIZE);
+
+ status = ath6kl_sdio_io(ar_sdio->func, scat_req->req,
+ scat_req->addr, scat_req->virt_dma_buf,
+ len);
+ goto scat_complete;
+ }
+
memset(&mmc_req, 0, sizeof(struct mmc_request));
memset(&cmd, 0, sizeof(struct mmc_command));
memset(&data, 0, sizeof(struct mmc_data));
@@ -284,6 +295,8 @@ static int ath6kl_sdio_scat_rw(struct ath6kl_sdio *ar_sdio,
mmc_wait_for_req(ar_sdio->func->card->host, &mmc_req);
status = cmd.error ? cmd.error : data.error;
+
+scat_complete:
scat_req->status = status;
if (scat_req->status)
OpenPOWER on IntegriCloud