|
|
@@ -439,10 +439,15 @@ static void sh_eth_modify(struct net_device *ndev, int enum_index, u32 clear,
|
|
|
enum_index);
|
|
|
}
|
|
|
|
|
|
+static u16 sh_eth_tsu_get_offset(struct sh_eth_private *mdp, int enum_index)
|
|
|
+{
|
|
|
+ return mdp->reg_offset[enum_index];
|
|
|
+}
|
|
|
+
|
|
|
static void sh_eth_tsu_write(struct sh_eth_private *mdp, u32 data,
|
|
|
int enum_index)
|
|
|
{
|
|
|
- u16 offset = mdp->reg_offset[enum_index];
|
|
|
+ u16 offset = sh_eth_tsu_get_offset(mdp, enum_index);
|
|
|
|
|
|
if (WARN_ON(offset == SH_ETH_OFFSET_INVALID))
|
|
|
return;
|
|
|
@@ -452,7 +457,7 @@ static void sh_eth_tsu_write(struct sh_eth_private *mdp, u32 data,
|
|
|
|
|
|
static u32 sh_eth_tsu_read(struct sh_eth_private *mdp, int enum_index)
|
|
|
{
|
|
|
- u16 offset = mdp->reg_offset[enum_index];
|
|
|
+ u16 offset = sh_eth_tsu_get_offset(mdp, enum_index);
|
|
|
|
|
|
if (WARN_ON(offset == SH_ETH_OFFSET_INVALID))
|
|
|
return ~0U;
|
|
|
@@ -2671,34 +2676,36 @@ static int sh_eth_tsu_busy(struct net_device *ndev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int sh_eth_tsu_write_entry(struct net_device *ndev, void *reg,
|
|
|
+static int sh_eth_tsu_write_entry(struct net_device *ndev, u16 offset,
|
|
|
const u8 *addr)
|
|
|
{
|
|
|
+ struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
u32 val;
|
|
|
|
|
|
val = addr[0] << 24 | addr[1] << 16 | addr[2] << 8 | addr[3];
|
|
|
- iowrite32(val, reg);
|
|
|
+ iowrite32(val, mdp->tsu_addr + offset);
|
|
|
if (sh_eth_tsu_busy(ndev) < 0)
|
|
|
return -EBUSY;
|
|
|
|
|
|
val = addr[4] << 8 | addr[5];
|
|
|
- iowrite32(val, reg + 4);
|
|
|
+ iowrite32(val, mdp->tsu_addr + offset + 4);
|
|
|
if (sh_eth_tsu_busy(ndev) < 0)
|
|
|
return -EBUSY;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void sh_eth_tsu_read_entry(void *reg, u8 *addr)
|
|
|
+static void sh_eth_tsu_read_entry(struct net_device *ndev, u16 offset, u8 *addr)
|
|
|
{
|
|
|
+ struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
u32 val;
|
|
|
|
|
|
- val = ioread32(reg);
|
|
|
+ val = ioread32(mdp->tsu_addr + offset);
|
|
|
addr[0] = (val >> 24) & 0xff;
|
|
|
addr[1] = (val >> 16) & 0xff;
|
|
|
addr[2] = (val >> 8) & 0xff;
|
|
|
addr[3] = val & 0xff;
|
|
|
- val = ioread32(reg + 4);
|
|
|
+ val = ioread32(mdp->tsu_addr + offset + 4);
|
|
|
addr[4] = (val >> 8) & 0xff;
|
|
|
addr[5] = val & 0xff;
|
|
|
}
|
|
|
@@ -2707,12 +2714,12 @@ static void sh_eth_tsu_read_entry(void *reg, u8 *addr)
|
|
|
static int sh_eth_tsu_find_entry(struct net_device *ndev, const u8 *addr)
|
|
|
{
|
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
- void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
+ u16 reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
int i;
|
|
|
u8 c_addr[ETH_ALEN];
|
|
|
|
|
|
for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) {
|
|
|
- sh_eth_tsu_read_entry(reg_offset, c_addr);
|
|
|
+ sh_eth_tsu_read_entry(ndev, reg_offset, c_addr);
|
|
|
if (ether_addr_equal(addr, c_addr))
|
|
|
return i;
|
|
|
}
|
|
|
@@ -2734,7 +2741,7 @@ static int sh_eth_tsu_disable_cam_entry_table(struct net_device *ndev,
|
|
|
int entry)
|
|
|
{
|
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
- void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
+ u16 reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
int ret;
|
|
|
u8 blank[ETH_ALEN];
|
|
|
|
|
|
@@ -2751,7 +2758,7 @@ static int sh_eth_tsu_disable_cam_entry_table(struct net_device *ndev,
|
|
|
static int sh_eth_tsu_add_entry(struct net_device *ndev, const u8 *addr)
|
|
|
{
|
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
- void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
+ u16 reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
int i, ret;
|
|
|
|
|
|
if (!mdp->cd->tsu)
|
|
|
@@ -2825,15 +2832,15 @@ static int sh_eth_tsu_purge_all(struct net_device *ndev)
|
|
|
static void sh_eth_tsu_purge_mcast(struct net_device *ndev)
|
|
|
{
|
|
|
struct sh_eth_private *mdp = netdev_priv(ndev);
|
|
|
+ u16 reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
u8 addr[ETH_ALEN];
|
|
|
- void *reg_offset = sh_eth_tsu_get_offset(mdp, TSU_ADRH0);
|
|
|
int i;
|
|
|
|
|
|
if (!mdp->cd->tsu)
|
|
|
return;
|
|
|
|
|
|
for (i = 0; i < SH_ETH_TSU_CAM_ENTRIES; i++, reg_offset += 8) {
|
|
|
- sh_eth_tsu_read_entry(reg_offset, addr);
|
|
|
+ sh_eth_tsu_read_entry(ndev, reg_offset, addr);
|
|
|
if (is_multicast_ether_addr(addr))
|
|
|
sh_eth_tsu_del_entry(ndev, addr);
|
|
|
}
|