net: ethernet: ti: ale: disable ale from stop()
[linux-2.6-block.git] / drivers / net / ethernet / ti / cpsw_ale.c
index b432a75fb874cec3acc680827e4310b495e65111..5eaaf8896941da0711af6eee7f72061e6ddf6e3a 100644 (file)
@@ -150,11 +150,11 @@ static int cpsw_ale_read(struct cpsw_ale *ale, int idx, u32 *ale_entry)
 
        WARN_ON(idx > ale->params.ale_entries);
 
-       __raw_writel(idx, ale->params.ale_regs + ALE_TABLE_CONTROL);
+       writel_relaxed(idx, ale->params.ale_regs + ALE_TABLE_CONTROL);
 
        for (i = 0; i < ALE_ENTRY_WORDS; i++)
-               ale_entry[i] = __raw_readl(ale->params.ale_regs +
-                                          ALE_TABLE + 4 * i);
+               ale_entry[i] = readl_relaxed(ale->params.ale_regs +
+                                            ALE_TABLE + 4 * i);
 
        return idx;
 }
@@ -166,11 +166,11 @@ static int cpsw_ale_write(struct cpsw_ale *ale, int idx, u32 *ale_entry)
        WARN_ON(idx > ale->params.ale_entries);
 
        for (i = 0; i < ALE_ENTRY_WORDS; i++)
-               __raw_writel(ale_entry[i], ale->params.ale_regs +
-                            ALE_TABLE + 4 * i);
+               writel_relaxed(ale_entry[i], ale->params.ale_regs +
+                              ALE_TABLE + 4 * i);
 
-       __raw_writel(idx | ALE_TABLE_WRITE, ale->params.ale_regs +
-                    ALE_TABLE_CONTROL);
+       writel_relaxed(idx | ALE_TABLE_WRITE, ale->params.ale_regs +
+                      ALE_TABLE_CONTROL);
 
        return idx;
 }
@@ -733,9 +733,9 @@ int cpsw_ale_control_set(struct cpsw_ale *ale, int port, int control,
        offset = info->offset + (port * info->port_offset);
        shift  = info->shift  + (port * info->port_shift);
 
-       tmp = __raw_readl(ale->params.ale_regs + offset);
+       tmp = readl_relaxed(ale->params.ale_regs + offset);
        tmp = (tmp & ~(mask << shift)) | (value << shift);
-       __raw_writel(tmp, ale->params.ale_regs + offset);
+       writel_relaxed(tmp, ale->params.ale_regs + offset);
 
        return 0;
 }
@@ -760,7 +760,7 @@ int cpsw_ale_control_get(struct cpsw_ale *ale, int port, int control)
        offset = info->offset + (port * info->port_offset);
        shift  = info->shift  + (port * info->port_shift);
 
-       tmp = __raw_readl(ale->params.ale_regs + offset) >> shift;
+       tmp = readl_relaxed(ale->params.ale_regs + offset) >> shift;
        return tmp & BITMASK(info->bits);
 }
 EXPORT_SYMBOL_GPL(cpsw_ale_control_get);
@@ -781,7 +781,7 @@ void cpsw_ale_start(struct cpsw_ale *ale)
 {
        u32 rev, ale_entries;
 
-       rev = __raw_readl(ale->params.ale_regs + ALE_IDVER);
+       rev = readl_relaxed(ale->params.ale_regs + ALE_IDVER);
        if (!ale->params.major_ver_mask)
                ale->params.major_ver_mask = 0xff;
        ale->version =
@@ -793,8 +793,8 @@ void cpsw_ale_start(struct cpsw_ale *ale)
 
        if (!ale->params.ale_entries) {
                ale_entries =
-                       __raw_readl(ale->params.ale_regs + ALE_STATUS) &
-                                   ALE_STATUS_SIZE_MASK;
+                       readl_relaxed(ale->params.ale_regs + ALE_STATUS) &
+                       ALE_STATUS_SIZE_MASK;
                /* ALE available on newer NetCP switches has introduced
                 * a register, ALE_STATUS, to indicate the size of ALE
                 * table which shows the size as a multiple of 1024 entries.
@@ -870,6 +870,7 @@ EXPORT_SYMBOL_GPL(cpsw_ale_start);
 void cpsw_ale_stop(struct cpsw_ale *ale)
 {
        del_timer_sync(&ale->timer);
+       cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
 }
 EXPORT_SYMBOL_GPL(cpsw_ale_stop);
 
@@ -892,7 +893,6 @@ int cpsw_ale_destroy(struct cpsw_ale *ale)
 {
        if (!ale)
                return -EINVAL;
-       cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
        kfree(ale);
        return 0;
 }