1#ifndef __ETHER_PHY_KSZ9893_H
2#define __ETHER_PHY_KSZ9893_H
9#include <netinterface.h>
11#define TAIL_TAG_RX_PTP_Pos 7
12#define TAIL_TAG_RX_PTP_Msk (1 << TAIL_TAG_RX_PTP_Pos)
14#define TAIL_TAG_RX_RCV_PORT_Pos 0
15#define TAIL_TAG_RX_RCV_PORT_Msk (0x3F << TAIL_TAG_RX_RCV_PORT_Pos)
16#define get_TAIL_TAG_RX_RCV_PORT(x) ((x & TAIL_TAG_RX_RCV_PORT_Msk) >> TAIL_TAG_RX_RCV_PORT_Pos)
18#define TAIL_TAG_TX_ROUTE_Pos (3 + portCount)
19#define TAIL_TAG_TX_ROUTE_Msk (1 << TAIL_TAG_TX_ROUTE_Pos)
20#define TAIL_TAG_TX_ROUTE_LOOKUP (1 << TAIL_TAG_TX_ROUTE_Pos)
21#define TAIL_TAG_TX_ROUTE_FIXED (0 << TAIL_TAG_TX_ROUTE_Pos)
23#define TAIL_TAG_TX_BLOCKING_OVERRIDE_Pos (2 + portCount)
24#define TAIL_TAG_TX_BLOCKING_OVERRIDE_Msk (1 << TAIL_TAG_TX_BLOCKING_OVERRIDE_Pos)
25#define TAIL_TAG_TX_BLOCKING_OVERRIDE_ENABLED (1 << TAIL_TAG_TX_BLOCKING_OVERRIDE_Pos)
26#define TAIL_TAG_TX_BLOCKING_OVERRIDE_DISABLED (0 << TAIL_TAG_TX_BLOCKING_OVERRIDE_Pos)
28#define TAIL_TAG_TX_PRIORITY_Pos (portCount)
29#define TAIL_TAG_TX_PRIORITY_Msk (3 << TAIL_TAG_TX_PRIORITY_Pos)
30#define TAIL_TAG_TX_PRIORITY(_prio) (((_prio) << TAIL_TAG_TX_PRIORITY_Pos) & TAIL_TAG_TX_PRIORITY_Msk)
32#define TAIL_TAG_TX_EGRESS_PORTS_Pos 0
33#define TAIL_TAG_TX_EGRESS_PORTS_Msk \
34 (((1 << portCount)-1)<<TAIL_TAG_TX_EGRESS_PORTS_Pos)
36#define TAIL_TAG_TX_EGRESS_PORT(_port) \
37 ((1 << (_port + TAIL_TAG_TX_EGRESS_PORTS_Pos)) & TAIL_TAG_TX_EGRESS_PORTS_Msk)
39#define TAIL_TAG_TX_EGRESS_PORTMASK(_portmask) \
40 ((_portmask << TAIL_TAG_TX_EGRESS_PORTS_Pos) & TAIL_TAG_TX_EGRESS_PORTS_Msk)
43#define IBA_CMD_CMD_Pos 29
44#define IBA_CMD_CMD_Msk (0x7 << IBA_CMD_CMD_Pos)
45#define IBA_CMD_BYTE_EN_Pos 24
46#define IBA_CMD_BYTE_EN_Msk (0xf << IBA_CMD_BYTE_EN_Pos)
47#define IBA_CMD_ADDR_Pos 0
48#define IBA_CMD_ADDR_Msk (((1UL << 24)-1) << IBA_CMD_ADDR_Pos)
50#define IBA_CMD_BYTE_0_Pos 24
51#define IBA_CMD_BYTE_0 (1 << IBA_CMD_BYTE_0_Pos)
52#define IBA_CMD_BYTE_1_Pos 25
53#define IBA_CMD_BYTE_1 (1 << IBA_CMD_BYTE_1_Pos)
54#define IBA_CMD_BYTE_2_Pos 26
55#define IBA_CMD_BYTE_2 (1 << IBA_CMD_BYTE_2_Pos)
56#define IBA_CMD_BYTE_3_Pos 27
57#define IBA_CMD_BYTE_3 (1 << IBA_CMD_BYTE_3_Pos)
59#define IBA_CMD_CMD_32 \
60 ( IBA_CMD_BYTE_0 | IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 | IBA_CMD_BYTE_3 )
62#define IBA_CMD_CMD_24 \
63 ( IBA_CMD_BYTE_0 | IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 )
64#define IBA_CMD_CMD_24_L \
66#define IBA_CMD_CMD_24_H \
67 ( IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 | IBA_CMD_BYTE_3 )
69#define IBA_CMD_CMD_16 \
70 ( IBA_CMD_BYTE_0 | IBA_CMD_BYTE_1 )
71#define IBA_CMD_CMD_16_L IBA_CMD_CMD_16
72#define IBA_CMD_CMD_16_M \
73 ( IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 )
74#define IBA_CMD_CMD_16_H \
75 ( IBA_CMD_BYTE_2 | IBA_CMD_BYTE_3 )
77#define IBA_CMD_CMD_8 \
80#define KSZ_I2C_ADDR 0x5F
82#define IBA_CMD_MAX_LEN 256
83#define IBA_DEFAULT_FRAME_TYPE 0x40FE
84#define IBA_FORMAT_KSZ98XX 0x9800
85#define IBA_CMD_MAX_WORDS (IBA_MAX_LEN/sizeof(uint32_t))
87#include <ether_phy_ksz9893_regs.h>
92class Phy_KSZ9893 :
public EtherPhy {
97 enum class eCmdType : uint16_t {
120 inline uint32_t getAddr()
121 {
return (cmd & IBA_CMD_ADDR_Msk) >> IBA_CMD_ADDR_Pos; }
122 inline uint32_t getBytes()
123 {
return (cmd & IBA_CMD_BYTE_EN_Msk) >> IBA_CMD_BYTE_EN_Pos; }
124 inline uint32_t getCmd()
125 {
return (cmd & IBA_CMD_CMD_Msk) >> IBA_CMD_CMD_Pos; }
128 inline uint32_t getBurstLen()
129 {
return (data[0] & 0x3F); }
130 inline beuint32_t * getBurstData()
131 {
return (data + 1); }
132 inline cmd_t *getNext(
bool isBurst =
false)
135 return ((cmd_t*)(data + 1 + getBurstLen()));
137 return ((cmd_t*)(data + 2));
141 { cmd = (EndOfList << IBA_CMD_CMD_Pos); data[0] = 0; }
142 inline void setAddr(uint32_t addr)
143 { cmd = (cmd & ~IBA_CMD_ADDR_Msk) | (((addr & ~0x3) << IBA_CMD_ADDR_Pos) & IBA_CMD_ADDR_Msk); }
144 inline void setBytes(uint32_t bytes)
145 { cmd |= (bytes << IBA_CMD_BYTE_EN_Pos) & IBA_CMD_BYTE_EN_Msk; }
146 inline void clrBytes()
147 { cmd &= ~IBA_CMD_BYTE_EN_Msk; }
148 inline void setCmd(uint32_t cmdval)
149 { cmd = (cmd & ~IBA_CMD_CMD_Msk) | ((cmdval << IBA_CMD_CMD_Pos) & IBA_CMD_CMD_Msk); }
150 int setVal(uint32_t addr, uint32_t val, uint32_t size);
152 {
return data[0] = 0; }
153 inline void setBurstLen(uint32_t len)
154 { data[0] = (len & 0x3F); }
155 } __attribute__((packed));
158 friend class IBAFrame;
163 Iterator(IBAFrame *iba);
164 Iterator(
const Iterator &it) : iba(it.iba), curr(it.curr) { }
166 inline Iterator & operator++() { curr = curr->getNext();
return *
this; }
167 inline Iterator operator++(
int)
170 curr = curr->getNext();
173 inline bool operator==(
const Iterator &rhs)
const {
return curr == rhs.curr;}
174 inline bool operator!=(
const Iterator &rhs)
const {
return curr != rhs.curr;}
175 inline bool operator<(
const Iterator &rhs)
const {
return curr < rhs.curr;}
176 inline cmd_t & operator*() {
return *curr; }
192 inline PoolPtr getPoolPtr()
195 return (PoolPtr)(((uint8_t*)
this)-((p->
pData)-((uint8_t*)&(p->pAsBytePtr))));
197 inline PEFRAME getEthHdr()
199 return (PEFRAME)getPoolPtr()->pData;
202 void *
operator new(
size_t size);
203 void *
operator new(
size_t size, PoolPtr pframe);
204 void operator delete(
void *);
206 void Init(
const Phy_KSZ9893 &phy,
const MACADR &src, eCmdType type);
208 inline void setDst(
const MACADR &_dst) { this->dst = _dst; }
209 inline void setSrc(
const MACADR &_src) { this->src = _src; }
210 inline void setType(uint16_t _type) { this->type = _type; }
211 inline void setCtrlInfo(uint8_t _info) { this->ctrlInfo = _info; }
212 inline void setSeqNum(uint8_t _seqnum) { this->seqnum = _seqnum; }
213 inline void setFormat(uint16_t _format) { this->format = _format; }
214 inline void setCode(eCmdType _code) { this->code = (uint16_t)_code; }
216 inline MACADR getDst() {
return dst; }
217 inline MACADR getSrc() {
return src; }
218 inline uint16_t getType() {
return type; }
219 inline uint8_t getCtrlInfo() {
return ctrlInfo; }
220 inline uint8_t getSeqNum() {
return seqnum; }
221 inline uint16_t getFormat() {
return format; }
222 inline uint16_t getCode() {
return code; }
224 inline void Reset() { len =
sizeof(IBAFrame); }
226 int AddCmd(cmd_t cmd);
227 int AddCmd(uint32_t cmd, uint32_t data);
228 int AddCmd(uint32_t cmd, uint32_t *data, uint32_t len);
230 cmd_t GetCmd(uint16_t idx);
231 cmd_t operator[](uint16_t idx);
232 } __attribute__((packed));
234 uint32_t portCount:4;
236 uint32_t bTailTaggingEnabled:1;
237 uint32_t bAwaitingResponse:1;
239 uint32_t bIBAEnabled;
240 uint16_t hIBAFrameType;
243 uint16_t hAccessFormat;
245 uint32_t portIntfValid;
247 uint8_t lastPhyIrq[16];;
248 eLinkMode_t phyMode[16];
249 MACADR staticMacAddrs[16];
251 KSZ_SwPortIntf **portIntfs;
252 config_chooser *swCfg;
254 static void FirstLinkUp(InterfaceBlock *net_eth,
bool up);
255 void init_phy_9563(
int port);
259 int write_reg(uint32_t reg, uint8_t* buf, uint32_t len);
260 int write_reg_8(uint32_t reg, uint8_t val);
261 int write_reg_16(uint32_t reg, uint16_t val);
262 int write_reg_32(uint32_t reg, uint32_t val);
263 int write_reg_mmd(
int port, uint16_t devid, uint16_t reg, uint16_t *data, uint16_t len);
264 int write_reg_mmd_16(
int port, uint16_t devid, uint16_t reg, uint16_t data);
268 int read_reg(uint32_t reg, uint8_t *buf, uint32_t len);
269 int read_reg_8(uint32_t reg, uint8_t *val);
270 int read_reg_16(uint32_t reg, uint16_t *val);
271 int read_reg_32(uint32_t reg, uint32_t *val);
272 int read_reg_mmd(
int port, uint16_t devid, uint16_t reg, uint16_t *data, uint16_t len=1);
274 int ConfigurePortDefaultVID(uint8_t portnum, uint16_t vid, uint8_t prio,
bool dropEligible);
276 int ConfigureVlan(uint16_t vid,
bool fwdOverride, uint8_t prio, uint16_t mask_untag, uint16_t mask_fwd);
278 int read_mib_counter(uint8_t portnum, uint8_t entry, uint64_t*val);
279 void SetTailTagging(
bool enable);
280 void EnableTailTagging() { SetTailTagging(
true); }
281 void DisableTailTagging() { SetTailTagging(
false); }
282 void DisableSwAutoForwarding();
283 int AddStaticMacAddress(MACADR macAddr, uint32_t portMap);
284 int RemoveStaticMacAddress(MACADR macAddr);
288 virtual eLinkState_t SetLinkMode(eLinkMode_t mode)
override;
289 virtual eLinkState_t SetLinkMode(eLinkMode_t mode,
int portNum);
290 virtual eLinkMode_t GetLinkMode();
291 virtual eLinkMode_t GetLinkMode(
int portNum);
292 virtual eLinkState_t GetLink()
override;
293 virtual eLinkState_t GetMacLink()
override;
294 virtual eLinkState_t GetLink(
int portnum);
295 virtual uint16_t ProcessIRQ()
override;
296 void SetMIIMode(eMIIMode_t mode)
override;
297 virtual void Disable()
override;
298 virtual void Enable()
override;
299 virtual void ShowMII()
override;
300 virtual void FinalizeFrame(PoolPtr pb, int64_t egress_port_mask,
int qos,
bool force)
override;
301 virtual bool DoRx(PoolPtr pb, uint16_t *rx_len,
int *logical_rx_ifnum)
override;
303 const ksz_98xx_regs_t ®() {
return *(ksz_98xx_regs_t*)NULL; }
307#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_KSZ9893
309class KSZ_SwPortIntf :
public EtherLikeInterface {
312 uint8_t portTagAlignBuf[0x10];
313 uint8_t *
const pPortTag;
314 eLinkState_t linkState;
315 eLinkMode_t reqLinkMode;
318 friend class Phy_KSZ9893;
319 eLinkState_t setLinkState(eLinkState_t newState);
322 KSZ_SwPortIntf(EthernetVars *parent,
int port, config_obj &owner,
323 const char *name,
const char *desc = NULL) __attribute__((noinline));
324 KSZ_SwPortIntf(EthernetVars *parent,
int port,
325 const char *name,
const char *desc = NULL) __attribute__((noinline));
327 void SetTailTagging(
bool enable, uint8_t portCount);
328 void EnableTailTagging(uint8_t portCount) { SetTailTagging(
true, portCount); }
329 void DisableTailTagging(uint8_t portCount) { SetTailTagging(
false, portCount); }
331 virtual void send_func(PoolPtr poolPtr);
336 virtual eLinkState_t SetLinkMode(eLinkMode_t mode);
337 virtual eLinkMode_t GetLinkMode();
338 virtual eLinkState_t GetLink();
virtual bool LinkDuplex()=0
Returns the full or half link duplex of the network interface.
virtual bool LinkActive()=0
Returns the link status of the network interface.
virtual int LinkSpeed()=0
Returns the link speed of the network interface.
void EnableMulticast(MACADR macAddress, int interface=0)
Enable Multicast on an existing interface.
uint8_t pData[ETHER_BUFFER_SIZE]
Buffer data payload (1548 bytes).
Definition buffers.h:104