123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- * Microchip KSZ series switch common definitions
- *
- * Copyright (C) 2017
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- #ifndef __KSZ_PRIV_H
- #define __KSZ_PRIV_H
- #include <linux/kernel.h>
- #include <linux/mutex.h>
- #include <linux/phy.h>
- #include <linux/etherdevice.h>
- #include <net/dsa.h>
- #include "ksz_9477_reg.h"
- struct ksz_io_ops;
- struct vlan_table {
- u32 table[3];
- };
- struct ksz_device {
- struct dsa_switch *ds;
- struct ksz_platform_data *pdata;
- const char *name;
- struct mutex reg_mutex; /* register access */
- struct mutex stats_mutex; /* status access */
- struct mutex alu_mutex; /* ALU access */
- struct mutex vlan_mutex; /* vlan access */
- const struct ksz_io_ops *ops;
- struct device *dev;
- void *priv;
- /* chip specific data */
- u32 chip_id;
- int num_vlans;
- int num_alus;
- int num_statics;
- int cpu_port; /* port connected to CPU */
- int cpu_ports; /* port bitmap can be cpu port */
- int port_cnt;
- struct vlan_table *vlan_cache;
- u64 mib_value[TOTAL_SWITCH_COUNTER_NUM];
- };
- struct ksz_io_ops {
- int (*read8)(struct ksz_device *dev, u32 reg, u8 *value);
- int (*read16)(struct ksz_device *dev, u32 reg, u16 *value);
- int (*read24)(struct ksz_device *dev, u32 reg, u32 *value);
- int (*read32)(struct ksz_device *dev, u32 reg, u32 *value);
- int (*write8)(struct ksz_device *dev, u32 reg, u8 value);
- int (*write16)(struct ksz_device *dev, u32 reg, u16 value);
- int (*write24)(struct ksz_device *dev, u32 reg, u32 value);
- int (*write32)(struct ksz_device *dev, u32 reg, u32 value);
- int (*phy_read16)(struct ksz_device *dev, int addr, int reg,
- u16 *value);
- int (*phy_write16)(struct ksz_device *dev, int addr, int reg,
- u16 value);
- };
- struct ksz_device *ksz_switch_alloc(struct device *base,
- const struct ksz_io_ops *ops, void *priv);
- int ksz_switch_detect(struct ksz_device *dev);
- int ksz_switch_register(struct ksz_device *dev);
- void ksz_switch_remove(struct ksz_device *dev);
- static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->read8(dev, reg, val);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->read16(dev, reg, val);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_read24(struct ksz_device *dev, u32 reg, u32 *val)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->read24(dev, reg, val);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->read32(dev, reg, val);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->write8(dev, reg, value);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->write16(dev, reg, value);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_write24(struct ksz_device *dev, u32 reg, u32 value)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->write24(dev, reg, value);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
- {
- int ret;
- mutex_lock(&dev->reg_mutex);
- ret = dev->ops->write32(dev, reg, value);
- mutex_unlock(&dev->reg_mutex);
- return ret;
- }
- static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
- u8 *data)
- {
- ksz_read8(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
- u16 *data)
- {
- ksz_read16(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
- u32 *data)
- {
- ksz_read32(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
- u8 data)
- {
- ksz_write8(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
- u16 data)
- {
- ksz_write16(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
- u32 data)
- {
- ksz_write32(dev, PORT_CTRL_ADDR(port, offset), data);
- }
- #endif
|