iwlwifi: add IO function for continuous write of target memory
authorHsu, Kenny <kenny.hsu@intel.com>
Fri, 9 Dec 2011 11:11:18 +0000 (03:11 -0800)
committerWey-Yi Guy <wey-yi.w.guy@intel.com>
Fri, 16 Dec 2011 15:24:03 +0000 (07:24 -0800)
Add new IO function _iwl_write_targ_mem_words() to support
target memory write for a continuous area. It will return
error code -EBUSY if iwl_grab_nic_access() fails to indicate
the memory write does not be performed. Meanwhile the existing
function iwl_write_targ_mem() also been updated by using
_iwl_write_targ_mem_words() in a single word case.

Signed-off-by: Kenny Hsu <kenny.hsu@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
drivers/net/wireless/iwlwifi/iwl-io.c
drivers/net/wireless/iwlwifi/iwl-io.h

index 3464cad7e38ccf9998e68b575e051eac74b47ca8..d57ea6484bbedf7529f47d6d79d4f79695bd6e19 100644 (file)
@@ -283,16 +283,29 @@ u32 iwl_read_targ_mem(struct iwl_bus *bus, u32 addr)
        return value;
 }
 
-void iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val)
+int _iwl_write_targ_mem_words(struct iwl_bus *bus, u32 addr,
+                               void *buf, int words)
 {
        unsigned long flags;
+       int offs, result = 0;
+       u32 *vals = buf;
 
        spin_lock_irqsave(&bus->reg_lock, flags);
        if (!iwl_grab_nic_access(bus)) {
                iwl_write32(bus, HBUS_TARG_MEM_WADDR, addr);
                wmb();
-               iwl_write32(bus, HBUS_TARG_MEM_WDAT, val);
+
+               for (offs = 0; offs < words; offs++)
+                       iwl_write32(bus, HBUS_TARG_MEM_WDAT, vals[offs]);
                iwl_release_nic_access(bus);
-       }
+       } else
+               result = -EBUSY;
        spin_unlock_irqrestore(&bus->reg_lock, flags);
+
+       return result;
+}
+
+int iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val)
+{
+       return _iwl_write_targ_mem_words(bus, addr, &val, 1);
 }
index ced2cbeb6eae56d3243fecc38798e64f78e5c69b..aae2eeb331a8e277e8cb668c9bfab6ddc5bad799 100644 (file)
@@ -85,6 +85,9 @@ void _iwl_read_targ_mem_words(struct iwl_bus *bus, u32 addr,
                                         (bufsize) / sizeof(u32));\
        } while (0)
 
+int _iwl_write_targ_mem_words(struct iwl_bus *bus, u32 addr,
+                             void *buf, int words);
+
 u32 iwl_read_targ_mem(struct iwl_bus *bus, u32 addr);
-void iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val);
+int iwl_write_targ_mem(struct iwl_bus *bus, u32 addr, u32 val);
 #endif