wlcore/wl12xx: add command trigger and event ack operations
authorLuciano Coelho <coelho@ti.com>
Wed, 11 Apr 2012 07:15:46 +0000 (10:15 +0300)
committerLuciano Coelho <coelho@ti.com>
Thu, 12 Apr 2012 05:43:57 +0000 (08:43 +0300)
Different chips may use different bits in the interrupt trigger
register.  Add operations to handle these differences.

Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wl12xx/reg.h
drivers/net/wireless/ti/wlcore/cmd.c
drivers/net/wireless/ti/wlcore/event.c
drivers/net/wireless/ti/wlcore/wlcore.h

index cef2884b37c8a4276c0f1d0dfb7a190da7440a3a..8d82203d3da84a5a2e755c886d55ccf7ee9a2cf6 100644 (file)
@@ -571,6 +571,16 @@ out:
        return ret;
 }
 
+static void wl12xx_trigger_cmd(struct wl1271 *wl)
+{
+       wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_CMD);
+}
+
+static void wl12xx_ack_event(struct wl1271 *wl)
+{
+       wlcore_write_reg(wl, REG_INTERRUPT_TRIG, WL12XX_INTR_TRIG_EVENT_ACK);
+}
+
 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
 {
        bool supported = false;
@@ -637,6 +647,8 @@ static void wl12xx_get_mac(struct wl1271 *wl)
 static struct wlcore_ops wl12xx_ops = {
        .identify_chip  = wl12xx_identify_chip,
        .boot           = wl12xx_boot,
+       .trigger_cmd    = wl12xx_trigger_cmd,
+       .ack_event      = wl12xx_ack_event,
        .get_pg_ver     = wl12xx_get_pg_ver,
        .get_mac        = wl12xx_get_mac,
 };
index 003041bdb5f73a89563d8d13498b898284689dea..79ede02e25870d862387a96dd6f15ee47531079e 100644 (file)
@@ -490,6 +490,22 @@ enum {
 
 /* end PLL configuration algorithm for wl128x */
 
+/*
+ * Host Command Interrupt. Setting this bit masks
+ * the interrupt that the host issues to inform
+ * the FW that it has sent a command
+ * to the Wlan hardware Command Mailbox.
+ */
+#define WL12XX_INTR_TRIG_CMD           BIT(0)
+
+/*
+ * Host Event Acknowlegde Interrupt. The host
+ * sets this bit to acknowledge that it received
+ * the unsolicited information from the event
+ * mailbox.
+ */
+#define WL12XX_INTR_TRIG_EVENT_ACK     BIT(1)
+
 /*===============================================
   HI_CFG Interface Configuration Register Values
   ------------------------------------------
index 3ec86e96f5c7ae85dcf7e4887b251cb04a6ae73c..e80f674e77cc9513ac7c7eed6e1b6a557f174845 100644 (file)
@@ -66,7 +66,11 @@ int wl1271_cmd_send(struct wl1271 *wl, u16 id, void *buf, size_t len,
 
        wl1271_write(wl, wl->cmd_box_addr, buf, len, false);
 
-       wlcore_write_reg(wl, REG_INTERRUPT_TRIG, INTR_TRIG_CMD);
+       /*
+        * TODO: we just need this because one bit is in a different
+        * place.  Is there any better way?
+        */
+       wl->ops->trigger_cmd(wl);
 
        timeout = jiffies + msecs_to_jiffies(WL1271_COMMAND_TIMEOUT);
 
index 078cb012fcca33c4eee6edc276ed834ba1f339f1..e3f572cbdf9a6019c085470138b5ee74a5fd9542 100644 (file)
@@ -305,8 +305,11 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num)
        if (ret < 0)
                return ret;
 
-       /* then we let the firmware know it can go on...*/
-       wlcore_write_reg(wl, REG_INTERRUPT_TRIG, INTR_TRIG_EVENT_ACK);
+       /*
+        * TODO: we just need this because one bit is in a different
+        * place.  Is there any better way?
+        */
+       wl->ops->ack_event(wl);
 
        return 0;
 }
index 38d1ed2967c8a8211e466f5d16ccb63d6cc34b22..76c27dd93c20806d20bbfece355573a2a13d822a 100644 (file)
@@ -30,6 +30,8 @@
 struct wlcore_ops {
        int (*identify_chip)(struct wl1271 *wl);
        int (*boot)(struct wl1271 *wl);
+       void (*trigger_cmd)(struct wl1271 *wl);
+       void (*ack_event)(struct wl1271 *wl);
        s8 (*get_pg_ver)(struct wl1271 *wl);
        void (*get_mac)(struct wl1271 *wl);
 };
@@ -344,22 +346,6 @@ int wlcore_free_hw(struct wl1271 *wl);
 
 /* Hardware to Embedded CPU Interrupts - first 32-bit register set */
 
-/*
- * Host Command Interrupt. Setting this bit masks
- * the interrupt that the host issues to inform
- * the FW that it has sent a command
- * to the Wlan hardware Command Mailbox.
- */
-#define INTR_TRIG_CMD       BIT(0)
-
-/*
- * Host Event Acknowlegde Interrupt. The host
- * sets this bit to acknowledge that it received
- * the unsolicited information from the event
- * mailbox.
- */
-#define INTR_TRIG_EVENT_ACK BIT(1)
-
 /*
  * The host sets this bit to inform the Wlan
  * FW that a TX packet is in the XFER