Commit 6ec23aaa authored by Arun Ramadoss's avatar Arun Ramadoss Committed by David S. Miller

net: dsa: microchip: move ksz_dev_ops to ksz_common.c

This patch move the ksz_dev_ops from individual files to ksz_common.c.
And the dev_ops is assigned to ksz_device based on the switch detect.
This reduces the redundant function and allows to reuse the
functionality for LAN937x which has similar register set.
Signed-off-by: default avatarArun Ramadoss <arun.ramadoss@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 07bca160
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#define __KSZ8XXX_H #define __KSZ8XXX_H
#include <linux/types.h> #include <linux/types.h>
#include <net/dsa.h>
#include "ksz_common.h"
enum ksz_regs { enum ksz_regs {
REG_IND_CTRL_0, REG_IND_CTRL_0,
...@@ -68,4 +70,50 @@ struct ksz8 { ...@@ -68,4 +70,50 @@ struct ksz8 {
void *priv; void *priv;
}; };
int ksz8_setup(struct dsa_switch *ds);
u32 ksz8_get_port_addr(int port, int offset);
void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member);
void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port);
void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port);
void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val);
int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr,
u8 *fid, u8 *src_port, u8 *timestamp, u16 *entries);
int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
struct alu_struct *alu);
void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr,
struct alu_struct *alu);
void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt);
void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
u64 *dropped, u64 *cnt);
void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze);
void ksz8_port_init_cnt(struct ksz_device *dev, int port);
int ksz8_fdb_dump(struct ksz_device *dev, int port,
dsa_fdb_dump_cb_t *cb, void *data);
int ksz8_mdb_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, struct dsa_db db);
int ksz8_mdb_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, struct dsa_db db);
int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag,
struct netlink_ext_ack *extack);
int ksz8_port_vlan_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack);
int ksz8_port_vlan_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan);
int ksz8_port_mirror_add(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror,
bool ingress, struct netlink_ext_ack *extack);
void ksz8_port_mirror_del(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror);
int ksz8_get_stp_reg(void);
void ksz8_get_caps(struct ksz_device *dev, int port,
struct phylink_config *config);
void ksz8_config_cpu_port(struct dsa_switch *ds);
int ksz8_enable_stp_addr(struct ksz_device *dev);
int ksz8_reset_switch(struct ksz_device *dev);
int ksz8_switch_detect(struct ksz_device *dev);
int ksz8_switch_init(struct ksz_device *dev);
void ksz8_switch_exit(struct ksz_device *dev);
#endif #endif
...@@ -162,7 +162,7 @@ static int ksz8_ind_write8(struct ksz_device *dev, u8 table, u16 addr, u8 data) ...@@ -162,7 +162,7 @@ static int ksz8_ind_write8(struct ksz_device *dev, u8 table, u16 addr, u8 data)
return ret; return ret;
} }
static int ksz8_reset_switch(struct ksz_device *dev) int ksz8_reset_switch(struct ksz_device *dev)
{ {
if (ksz_is_ksz88x3(dev)) { if (ksz_is_ksz88x3(dev)) {
/* reset switch */ /* reset switch */
...@@ -213,7 +213,7 @@ static void ksz8795_set_prio_queue(struct ksz_device *dev, int port, int queue) ...@@ -213,7 +213,7 @@ static void ksz8795_set_prio_queue(struct ksz_device *dev, int port, int queue)
true); true);
} }
static void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt) void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
const u32 *masks; const u32 *masks;
...@@ -334,7 +334,7 @@ static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, ...@@ -334,7 +334,7 @@ static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
} }
} }
static void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
u64 *dropped, u64 *cnt) u64 *dropped, u64 *cnt)
{ {
if (ksz_is_ksz88x3(dev)) if (ksz_is_ksz88x3(dev))
...@@ -343,7 +343,7 @@ static void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr, ...@@ -343,7 +343,7 @@ static void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt); ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt);
} }
static void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze) void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze)
{ {
if (ksz_is_ksz88x3(dev)) if (ksz_is_ksz88x3(dev))
return; return;
...@@ -358,7 +358,7 @@ static void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze) ...@@ -358,7 +358,7 @@ static void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze)
ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false); ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false);
} }
static void ksz8_port_init_cnt(struct ksz_device *dev, int port) void ksz8_port_init_cnt(struct ksz_device *dev, int port)
{ {
struct ksz_port_mib *mib = &dev->ports[port].mib; struct ksz_port_mib *mib = &dev->ports[port].mib;
u64 *dropped; u64 *dropped;
...@@ -447,9 +447,8 @@ static int ksz8_valid_dyn_entry(struct ksz_device *dev, u8 *data) ...@@ -447,9 +447,8 @@ static int ksz8_valid_dyn_entry(struct ksz_device *dev, u8 *data)
return 0; return 0;
} }
static int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr,
u8 *mac_addr, u8 *fid, u8 *src_port, u8 *fid, u8 *src_port, u8 *timestamp, u16 *entries)
u8 *timestamp, u16 *entries)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
u32 data_hi, data_lo; u32 data_hi, data_lo;
...@@ -512,7 +511,7 @@ static int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, ...@@ -512,7 +511,7 @@ static int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr,
return rc; return rc;
} }
static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr, int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
struct alu_struct *alu) struct alu_struct *alu)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
...@@ -551,7 +550,7 @@ static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr, ...@@ -551,7 +550,7 @@ static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
return -ENXIO; return -ENXIO;
} }
static void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr, void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr,
struct alu_struct *alu) struct alu_struct *alu)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
...@@ -663,7 +662,7 @@ static void ksz8_w_vlan_table(struct ksz_device *dev, u16 vid, u16 vlan) ...@@ -663,7 +662,7 @@ static void ksz8_w_vlan_table(struct ksz_device *dev, u16 vid, u16 vlan)
ksz8_w_table(dev, TABLE_VLAN, addr, buf); ksz8_w_table(dev, TABLE_VLAN, addr, buf);
} }
static void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val) void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
u8 restart, speed, ctrl, link; u8 restart, speed, ctrl, link;
...@@ -786,7 +785,7 @@ static void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val) ...@@ -786,7 +785,7 @@ static void ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
*val = data; *val = data;
} }
static void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
u8 restart, speed, ctrl, data; u8 restart, speed, ctrl, data;
...@@ -898,7 +897,7 @@ static void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) ...@@ -898,7 +897,7 @@ static void ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
} }
} }
static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member) void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
{ {
u8 data; u8 data;
...@@ -908,7 +907,7 @@ static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member) ...@@ -908,7 +907,7 @@ static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
ksz_pwrite8(dev, port, P_MIRROR_CTRL, data); ksz_pwrite8(dev, port, P_MIRROR_CTRL, data);
} }
static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port) void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
{ {
u8 learn[DSA_MAX_PORTS]; u8 learn[DSA_MAX_PORTS];
int first, index, cnt; int first, index, cnt;
...@@ -941,7 +940,7 @@ static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port) ...@@ -941,7 +940,7 @@ static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
} }
} }
static int ksz8_fdb_dump(struct ksz_device *dev, int port, int ksz8_fdb_dump(struct ksz_device *dev, int port,
dsa_fdb_dump_cb_t *cb, void *data) dsa_fdb_dump_cb_t *cb, void *data)
{ {
int ret = 0; int ret = 0;
...@@ -969,9 +968,8 @@ static int ksz8_fdb_dump(struct ksz_device *dev, int port, ...@@ -969,9 +968,8 @@ static int ksz8_fdb_dump(struct ksz_device *dev, int port,
return ret; return ret;
} }
static int ksz8_mdb_add(struct ksz_device *dev, int port, int ksz8_mdb_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, const struct switchdev_obj_port_mdb *mdb, struct dsa_db db)
struct dsa_db db)
{ {
struct alu_struct alu; struct alu_struct alu;
int index; int index;
...@@ -1013,9 +1011,8 @@ static int ksz8_mdb_add(struct ksz_device *dev, int port, ...@@ -1013,9 +1011,8 @@ static int ksz8_mdb_add(struct ksz_device *dev, int port,
return 0; return 0;
} }
static int ksz8_mdb_del(struct ksz_device *dev, int port, int ksz8_mdb_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, const struct switchdev_obj_port_mdb *mdb, struct dsa_db db)
struct dsa_db db)
{ {
struct alu_struct alu; struct alu_struct alu;
int index; int index;
...@@ -1043,7 +1040,7 @@ static int ksz8_mdb_del(struct ksz_device *dev, int port, ...@@ -1043,7 +1040,7 @@ static int ksz8_mdb_del(struct ksz_device *dev, int port,
return 0; return 0;
} }
static int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag, int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
if (ksz_is_ksz88x3(dev)) if (ksz_is_ksz88x3(dev))
...@@ -1070,7 +1067,7 @@ static void ksz8_port_enable_pvid(struct ksz_device *dev, int port, bool state) ...@@ -1070,7 +1067,7 @@ static void ksz8_port_enable_pvid(struct ksz_device *dev, int port, bool state)
} }
} }
static int ksz8_port_vlan_add(struct ksz_device *dev, int port, int ksz8_port_vlan_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan, const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
...@@ -1142,7 +1139,7 @@ static int ksz8_port_vlan_add(struct ksz_device *dev, int port, ...@@ -1142,7 +1139,7 @@ static int ksz8_port_vlan_add(struct ksz_device *dev, int port,
return 0; return 0;
} }
static int ksz8_port_vlan_del(struct ksz_device *dev, int port, int ksz8_port_vlan_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan) const struct switchdev_obj_port_vlan *vlan)
{ {
u16 data, pvid; u16 data, pvid;
...@@ -1174,7 +1171,7 @@ static int ksz8_port_vlan_del(struct ksz_device *dev, int port, ...@@ -1174,7 +1171,7 @@ static int ksz8_port_vlan_del(struct ksz_device *dev, int port,
return 0; return 0;
} }
static int ksz8_port_mirror_add(struct ksz_device *dev, int port, int ksz8_port_mirror_add(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror, struct dsa_mall_mirror_tc_entry *mirror,
bool ingress, struct netlink_ext_ack *extack) bool ingress, struct netlink_ext_ack *extack)
{ {
...@@ -1196,7 +1193,7 @@ static int ksz8_port_mirror_add(struct ksz_device *dev, int port, ...@@ -1196,7 +1193,7 @@ static int ksz8_port_mirror_add(struct ksz_device *dev, int port,
return 0; return 0;
} }
static void ksz8_port_mirror_del(struct ksz_device *dev, int port, void ksz8_port_mirror_del(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror) struct dsa_mall_mirror_tc_entry *mirror)
{ {
u8 data; u8 data;
...@@ -1264,7 +1261,7 @@ static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port) ...@@ -1264,7 +1261,7 @@ static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port)
p->phydev.duplex = 1; p->phydev.duplex = 1;
} }
static void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port) void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
{ {
struct dsa_switch *ds = dev->ds; struct dsa_switch *ds = dev->ds;
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
...@@ -1301,7 +1298,7 @@ static void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port) ...@@ -1301,7 +1298,7 @@ static void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
ksz8_cfg_port_member(dev, port, member); ksz8_cfg_port_member(dev, port, member);
} }
static void ksz8_config_cpu_port(struct dsa_switch *ds) void ksz8_config_cpu_port(struct dsa_switch *ds)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
...@@ -1368,7 +1365,7 @@ static int ksz8_handle_global_errata(struct dsa_switch *ds) ...@@ -1368,7 +1365,7 @@ static int ksz8_handle_global_errata(struct dsa_switch *ds)
return ret; return ret;
} }
static int ksz8_enable_stp_addr(struct ksz_device *dev) int ksz8_enable_stp_addr(struct ksz_device *dev)
{ {
struct alu_struct alu; struct alu_struct alu;
...@@ -1384,7 +1381,7 @@ static int ksz8_enable_stp_addr(struct ksz_device *dev) ...@@ -1384,7 +1381,7 @@ static int ksz8_enable_stp_addr(struct ksz_device *dev)
return 0; return 0;
} }
static int ksz8_setup(struct dsa_switch *ds) int ksz8_setup(struct dsa_switch *ds)
{ {
struct ksz_device *dev = ds->priv; struct ksz_device *dev = ds->priv;
int i; int i;
...@@ -1419,7 +1416,7 @@ static int ksz8_setup(struct dsa_switch *ds) ...@@ -1419,7 +1416,7 @@ static int ksz8_setup(struct dsa_switch *ds)
return ksz8_handle_global_errata(ds); return ksz8_handle_global_errata(ds);
} }
static void ksz8_get_caps(struct ksz_device *dev, int port, void ksz8_get_caps(struct ksz_device *dev, int port,
struct phylink_config *config) struct phylink_config *config)
{ {
config->mac_capabilities = MAC_10 | MAC_100; config->mac_capabilities = MAC_10 | MAC_100;
...@@ -1437,12 +1434,12 @@ static void ksz8_get_caps(struct ksz_device *dev, int port, ...@@ -1437,12 +1434,12 @@ static void ksz8_get_caps(struct ksz_device *dev, int port,
config->mac_capabilities |= MAC_ASYM_PAUSE; config->mac_capabilities |= MAC_ASYM_PAUSE;
} }
static u32 ksz8_get_port_addr(int port, int offset) u32 ksz8_get_port_addr(int port, int offset)
{ {
return PORT_CTRL_ADDR(port, offset); return PORT_CTRL_ADDR(port, offset);
} }
static int ksz8_switch_init(struct ksz_device *dev) int ksz8_switch_init(struct ksz_device *dev)
{ {
struct ksz8 *ksz8 = dev->priv; struct ksz8 *ksz8 = dev->priv;
...@@ -1473,42 +1470,14 @@ static int ksz8_switch_init(struct ksz_device *dev) ...@@ -1473,42 +1470,14 @@ static int ksz8_switch_init(struct ksz_device *dev)
return 0; return 0;
} }
static void ksz8_switch_exit(struct ksz_device *dev) void ksz8_switch_exit(struct ksz_device *dev)
{ {
ksz8_reset_switch(dev); ksz8_reset_switch(dev);
} }
static const struct ksz_dev_ops ksz8_dev_ops = {
.setup = ksz8_setup,
.get_port_addr = ksz8_get_port_addr,
.cfg_port_member = ksz8_cfg_port_member,
.flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
.port_setup = ksz8_port_setup,
.r_phy = ksz8_r_phy,
.w_phy = ksz8_w_phy,
.r_mib_cnt = ksz8_r_mib_cnt,
.r_mib_pkt = ksz8_r_mib_pkt,
.freeze_mib = ksz8_freeze_mib,
.port_init_cnt = ksz8_port_init_cnt,
.fdb_dump = ksz8_fdb_dump,
.mdb_add = ksz8_mdb_add,
.mdb_del = ksz8_mdb_del,
.vlan_filtering = ksz8_port_vlan_filtering,
.vlan_add = ksz8_port_vlan_add,
.vlan_del = ksz8_port_vlan_del,
.mirror_add = ksz8_port_mirror_add,
.mirror_del = ksz8_port_mirror_del,
.get_caps = ksz8_get_caps,
.config_cpu_port = ksz8_config_cpu_port,
.enable_stp_addr = ksz8_enable_stp_addr,
.reset = ksz8_reset_switch,
.init = ksz8_switch_init,
.exit = ksz8_switch_exit,
};
int ksz8_switch_register(struct ksz_device *dev) int ksz8_switch_register(struct ksz_device *dev)
{ {
return ksz_switch_register(dev, &ksz8_dev_ops); return ksz_switch_register(dev);
} }
EXPORT_SYMBOL(ksz8_switch_register); EXPORT_SYMBOL(ksz8_switch_register);
......
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Microchip KSZ9477 series Header file
*
* Copyright (C) 2017-2022 Microchip Technology Inc.
*/
#ifndef __KSZ9477_H
#define __KSZ9477_H
#include <net/dsa.h>
#include "ksz_common.h"
int ksz9477_setup(struct dsa_switch *ds);
u32 ksz9477_get_port_addr(int port, int offset);
void ksz9477_cfg_port_member(struct ksz_device *dev, int port, u8 member);
void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port);
void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port);
void ksz9477_r_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 *data);
void ksz9477_w_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 val);
void ksz9477_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt);
void ksz9477_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
u64 *dropped, u64 *cnt);
void ksz9477_freeze_mib(struct ksz_device *dev, int port, bool freeze);
void ksz9477_port_init_cnt(struct ksz_device *dev, int port);
int ksz9477_port_vlan_filtering(struct ksz_device *dev, int port,
bool flag, struct netlink_ext_ack *extack);
int ksz9477_port_vlan_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan,
struct netlink_ext_ack *extack);
int ksz9477_port_vlan_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_vlan *vlan);
int ksz9477_port_mirror_add(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror,
bool ingress, struct netlink_ext_ack *extack);
void ksz9477_port_mirror_del(struct ksz_device *dev, int port,
struct dsa_mall_mirror_tc_entry *mirror);
int ksz9477_get_stp_reg(void);
void ksz9477_get_caps(struct ksz_device *dev, int port,
struct phylink_config *config);
int ksz9477_fdb_dump(struct ksz_device *dev, int port,
dsa_fdb_dump_cb_t *cb, void *data);
int ksz9477_fdb_add(struct ksz_device *dev, int port,
const unsigned char *addr, u16 vid, struct dsa_db db);
int ksz9477_fdb_del(struct ksz_device *dev, int port,
const unsigned char *addr, u16 vid, struct dsa_db db);
int ksz9477_mdb_add(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, struct dsa_db db);
int ksz9477_mdb_del(struct ksz_device *dev, int port,
const struct switchdev_obj_port_mdb *mdb, struct dsa_db db);
int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu);
int ksz9477_max_mtu(struct ksz_device *dev, int port);
void ksz9477_config_cpu_port(struct dsa_switch *ds);
int ksz9477_enable_stp_addr(struct ksz_device *dev);
int ksz9477_reset_switch(struct ksz_device *dev);
int ksz9477_dsa_init(struct ksz_device *dev);
int ksz9477_switch_init(struct ksz_device *dev);
void ksz9477_switch_exit(struct ksz_device *dev);
#endif
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <net/switchdev.h> #include <net/switchdev.h>
#include "ksz_common.h" #include "ksz_common.h"
#include "ksz8.h"
#include "ksz9477.h"
#define MIB_COUNTER_NUM 0x20 #define MIB_COUNTER_NUM 0x20
...@@ -139,6 +141,66 @@ static const struct ksz_mib_names ksz9477_mib_names[] = { ...@@ -139,6 +141,66 @@ static const struct ksz_mib_names ksz9477_mib_names[] = {
{ 0x83, "tx_discards" }, { 0x83, "tx_discards" },
}; };
static const struct ksz_dev_ops ksz8_dev_ops = {
.setup = ksz8_setup,
.get_port_addr = ksz8_get_port_addr,
.cfg_port_member = ksz8_cfg_port_member,
.flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
.port_setup = ksz8_port_setup,
.r_phy = ksz8_r_phy,
.w_phy = ksz8_w_phy,
.r_mib_pkt = ksz8_r_mib_pkt,
.freeze_mib = ksz8_freeze_mib,
.port_init_cnt = ksz8_port_init_cnt,
.fdb_dump = ksz8_fdb_dump,
.mdb_add = ksz8_mdb_add,
.mdb_del = ksz8_mdb_del,
.vlan_filtering = ksz8_port_vlan_filtering,
.vlan_add = ksz8_port_vlan_add,
.vlan_del = ksz8_port_vlan_del,
.mirror_add = ksz8_port_mirror_add,
.mirror_del = ksz8_port_mirror_del,
.get_caps = ksz8_get_caps,
.config_cpu_port = ksz8_config_cpu_port,
.enable_stp_addr = ksz8_enable_stp_addr,
.reset = ksz8_reset_switch,
.init = ksz8_switch_init,
.exit = ksz8_switch_exit,
};
static const struct ksz_dev_ops ksz9477_dev_ops = {
.setup = ksz9477_setup,
.get_port_addr = ksz9477_get_port_addr,
.cfg_port_member = ksz9477_cfg_port_member,
.flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
.port_setup = ksz9477_port_setup,
.r_phy = ksz9477_r_phy,
.w_phy = ksz9477_w_phy,
.r_mib_cnt = ksz9477_r_mib_cnt,
.r_mib_pkt = ksz9477_r_mib_pkt,
.r_mib_stat64 = ksz_r_mib_stats64,
.freeze_mib = ksz9477_freeze_mib,
.port_init_cnt = ksz9477_port_init_cnt,
.vlan_filtering = ksz9477_port_vlan_filtering,
.vlan_add = ksz9477_port_vlan_add,
.vlan_del = ksz9477_port_vlan_del,
.mirror_add = ksz9477_port_mirror_add,
.mirror_del = ksz9477_port_mirror_del,
.get_caps = ksz9477_get_caps,
.fdb_dump = ksz9477_fdb_dump,
.fdb_add = ksz9477_fdb_add,
.fdb_del = ksz9477_fdb_del,
.mdb_add = ksz9477_mdb_add,
.mdb_del = ksz9477_mdb_del,
.change_mtu = ksz9477_change_mtu,
.max_mtu = ksz9477_max_mtu,
.config_cpu_port = ksz9477_config_cpu_port,
.enable_stp_addr = ksz9477_enable_stp_addr,
.reset = ksz9477_reset_switch,
.init = ksz9477_switch_init,
.exit = ksz9477_switch_exit,
};
const struct ksz_chip_data ksz_switch_chips[] = { const struct ksz_chip_data ksz_switch_chips[] = {
[KSZ8795] = { [KSZ8795] = {
.chip_id = KSZ8795_CHIP_ID, .chip_id = KSZ8795_CHIP_ID,
...@@ -148,6 +210,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -148,6 +210,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 8, .num_statics = 8,
.cpu_ports = 0x10, /* can be configured as cpu port */ .cpu_ports = 0x10, /* can be configured as cpu port */
.port_cnt = 5, /* total cpu and user ports */ .port_cnt = 5, /* total cpu and user ports */
.ops = &ksz8_dev_ops,
.ksz87xx_eee_link_erratum = true, .ksz87xx_eee_link_erratum = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -184,6 +247,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -184,6 +247,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 8, .num_statics = 8,
.cpu_ports = 0x10, /* can be configured as cpu port */ .cpu_ports = 0x10, /* can be configured as cpu port */
.port_cnt = 5, /* total cpu and user ports */ .port_cnt = 5, /* total cpu and user ports */
.ops = &ksz8_dev_ops,
.ksz87xx_eee_link_erratum = true, .ksz87xx_eee_link_erratum = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -206,6 +270,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -206,6 +270,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 8, .num_statics = 8,
.cpu_ports = 0x10, /* can be configured as cpu port */ .cpu_ports = 0x10, /* can be configured as cpu port */
.port_cnt = 5, /* total cpu and user ports */ .port_cnt = 5, /* total cpu and user ports */
.ops = &ksz8_dev_ops,
.ksz87xx_eee_link_erratum = true, .ksz87xx_eee_link_erratum = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -228,6 +293,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -228,6 +293,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 8, .num_statics = 8,
.cpu_ports = 0x4, /* can be configured as cpu port */ .cpu_ports = 0x4, /* can be configured as cpu port */
.port_cnt = 3, .port_cnt = 3,
.ops = &ksz8_dev_ops,
.mib_names = ksz88xx_mib_names, .mib_names = ksz88xx_mib_names,
.mib_cnt = ARRAY_SIZE(ksz88xx_mib_names), .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
.reg_mib_cnt = MIB_COUNTER_NUM, .reg_mib_cnt = MIB_COUNTER_NUM,
...@@ -248,6 +314,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -248,6 +314,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 16, .num_statics = 16,
.cpu_ports = 0x7F, /* can be configured as cpu port */ .cpu_ports = 0x7F, /* can be configured as cpu port */
.port_cnt = 7, /* total physical port count */ .port_cnt = 7, /* total physical port count */
.ops = &ksz9477_dev_ops,
.phy_errata_9477 = true, .phy_errata_9477 = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -274,6 +341,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -274,6 +341,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 16, .num_statics = 16,
.cpu_ports = 0x7F, /* can be configured as cpu port */ .cpu_ports = 0x7F, /* can be configured as cpu port */
.port_cnt = 7, /* total physical port count */ .port_cnt = 7, /* total physical port count */
.ops = &ksz9477_dev_ops,
.phy_errata_9477 = true, .phy_errata_9477 = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -300,6 +368,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -300,6 +368,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 16, .num_statics = 16,
.cpu_ports = 0x07, /* can be configured as cpu port */ .cpu_ports = 0x07, /* can be configured as cpu port */
.port_cnt = 3, /* total port count */ .port_cnt = 3, /* total port count */
.ops = &ksz9477_dev_ops,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
.reg_mib_cnt = MIB_COUNTER_NUM, .reg_mib_cnt = MIB_COUNTER_NUM,
...@@ -321,6 +390,7 @@ const struct ksz_chip_data ksz_switch_chips[] = { ...@@ -321,6 +390,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
.num_statics = 16, .num_statics = 16,
.cpu_ports = 0x7F, /* can be configured as cpu port */ .cpu_ports = 0x7F, /* can be configured as cpu port */
.port_cnt = 7, /* total physical port count */ .port_cnt = 7, /* total physical port count */
.ops = &ksz9477_dev_ops,
.phy_errata_9477 = true, .phy_errata_9477 = true,
.mib_names = ksz9477_mib_names, .mib_names = ksz9477_mib_names,
.mib_cnt = ARRAY_SIZE(ksz9477_mib_names), .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
...@@ -1209,8 +1279,7 @@ struct ksz_device *ksz_switch_alloc(struct device *base, void *priv) ...@@ -1209,8 +1279,7 @@ struct ksz_device *ksz_switch_alloc(struct device *base, void *priv)
} }
EXPORT_SYMBOL(ksz_switch_alloc); EXPORT_SYMBOL(ksz_switch_alloc);
int ksz_switch_register(struct ksz_device *dev, int ksz_switch_register(struct ksz_device *dev)
const struct ksz_dev_ops *ops)
{ {
const struct ksz_chip_data *info; const struct ksz_chip_data *info;
struct device_node *port, *ports; struct device_node *port, *ports;
...@@ -1257,7 +1326,7 @@ int ksz_switch_register(struct ksz_device *dev, ...@@ -1257,7 +1326,7 @@ int ksz_switch_register(struct ksz_device *dev,
if (ret) if (ret)
return ret; return ret;
dev->dev_ops = ops; dev->dev_ops = dev->info->ops;
ret = dev->dev_ops->init(dev); ret = dev->dev_ops->init(dev);
if (ret) if (ret)
......
...@@ -41,6 +41,7 @@ struct ksz_chip_data { ...@@ -41,6 +41,7 @@ struct ksz_chip_data {
int num_statics; int num_statics;
int cpu_ports; int cpu_ports;
int port_cnt; int port_cnt;
const struct ksz_dev_ops *ops;
bool phy_errata_9477; bool phy_errata_9477;
bool ksz87xx_eee_link_erratum; bool ksz87xx_eee_link_erratum;
const struct ksz_mib_names *mib_names; const struct ksz_mib_names *mib_names;
...@@ -216,8 +217,7 @@ struct ksz_dev_ops { ...@@ -216,8 +217,7 @@ struct ksz_dev_ops {
}; };
struct ksz_device *ksz_switch_alloc(struct device *base, void *priv); struct ksz_device *ksz_switch_alloc(struct device *base, void *priv);
int ksz_switch_register(struct ksz_device *dev, int ksz_switch_register(struct ksz_device *dev);
const struct ksz_dev_ops *ops);
void ksz_switch_remove(struct ksz_device *dev); void ksz_switch_remove(struct ksz_device *dev);
int ksz8_switch_register(struct ksz_device *dev); int ksz8_switch_register(struct ksz_device *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment