NetBurner 3.5.8
PDF Version
ether_phy_ksz9893.h
1#ifndef __ETHER_PHY_KSZ9893_H
2#define __ETHER_PHY_KSZ9893_H
3/*NB_REVISION*/
4
5/*NB_COPYRIGHT*/
6
7#include <autoip.h>
8#include <ether_phy.h>
9#include <netinterface.h>
10
11#define TAIL_TAG_RX_PTP_Pos 7
12#define TAIL_TAG_RX_PTP_Msk (1 << TAIL_TAG_RX_PTP_Pos)
13
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)
17
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)
22
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)
27
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)
31
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)
35
36#define TAIL_TAG_TX_EGRESS_PORT(_port) \
37 ((1 << (_port + TAIL_TAG_TX_EGRESS_PORTS_Pos)) & TAIL_TAG_TX_EGRESS_PORTS_Msk)
38
39#define TAIL_TAG_TX_EGRESS_PORTMASK(_portmask) \
40 ((_portmask << TAIL_TAG_TX_EGRESS_PORTS_Pos) & TAIL_TAG_TX_EGRESS_PORTS_Msk)
41
42
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)
49
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)
58
59#define IBA_CMD_CMD_32 \
60 ( IBA_CMD_BYTE_0 | IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 | IBA_CMD_BYTE_3 )
61
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 \
65 IBA_CMD_CMD_24
66#define IBA_CMD_CMD_24_H \
67 ( IBA_CMD_BYTE_1 | IBA_CMD_BYTE_2 | IBA_CMD_BYTE_3 )
68
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 )
76
77#define IBA_CMD_CMD_8 \
78 ( IBA_CMD_BYTE_0 )
79
80#define KSZ_I2C_ADDR 0x5F
81
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))
86
87#include <ether_phy_ksz9893_regs.h>
88#include <bb_i2c.h>
89
90class KSZ_SwPortIntf;
91
92class Phy_KSZ9893 : public EtherPhy {
93private:
94public:
95 class IBAFrame {
96 public:
97 enum class eCmdType : uint16_t {
98 Normal = 0x1,
99 Burst = 0x2
100 };
101 struct cmd_t {
102 enum {
103 Read = 1,
104 Write = 2,
105 Wait_0 = 4,
106 Wait_1 = 5,
107 Modify_0 = 6,
108 Clear = 6,
109 Modify_1 = 7,
110 Set = 7,
111
112 BurstRead = 2,
113 BurstWrite = 4,
114
115 EndOfList = 0
116 };
117 beuint32_t cmd;
118 beuint32_t data[1];
119
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; }
126 uint32_t getVal();
127
128 inline uint32_t getBurstLen() // 32bit word count, not bytes.
129 { return (data[0] & 0x3F); }
130 inline beuint32_t * getBurstData()
131 { return (data + 1); }
132 inline cmd_t *getNext(bool isBurst = false)
133 {
134 if (isBurst)
135 return ((cmd_t*)(data + 1 + getBurstLen()));
136 else
137 return ((cmd_t*)(data + 2));
138 }
139
140 inline void reset()
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);
151 inline int clrVal()
152 { return data[0] = 0; }
153 inline void setBurstLen(uint32_t len) // 32bit word count, not bytes.
154 { data[0] = (len & 0x3F); }
155 } __attribute__((packed));
156
157 class Iterator {
158 friend class IBAFrame;
159 IBAFrame *iba;
160 cmd_t *curr;
161
162 Iterator();
163 Iterator(IBAFrame *iba);
164 Iterator(const Iterator &it) : iba(it.iba), curr(it.curr) { }
165 public:
166 inline Iterator & operator++() { curr = curr->getNext(); return *this; }
167 inline Iterator operator++(int)
168 {
169 Iterator ret(*this);
170 curr = curr->getNext();
171 return ret;
172 }
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; }
177 };
178
179 public:
180 MACADR dst;
181 MACADR src;
182 beuint16_t type;
183 uint8_t ctrlInfo;
184 uint8_t seqnum;
185 beuint16_t len;
186 beuint16_t format;
187 beuint16_t RESERVED;
188 beuint16_t code;
189 cmd_t cmd[];
190
191 public:
192 inline PoolPtr getPoolPtr()
193 {
194 PoolPtr p;
195 return (PoolPtr)(((uint8_t*)this)-((p->pData)-((uint8_t*)&(p->pAsBytePtr))));
196 }
197 inline PEFRAME getEthHdr()
198 {
199 return (PEFRAME)getPoolPtr()->pData;
200 }
201 IBAFrame();
202 void *operator new(size_t size);
203 void *operator new(size_t size, PoolPtr pframe);
204 void operator delete(void *);
205
206 void Init(const Phy_KSZ9893 &phy, const MACADR &src, eCmdType type);
207
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; }
215
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; }
223
224 inline void Reset() { len = sizeof(IBAFrame); }
225
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);
229 uint16_t GetCount();
230 cmd_t GetCmd(uint16_t idx);
231 cmd_t operator[](uint16_t idx);
232 } __attribute__((packed));
233private:
234 uint32_t portCount:4;
235 uint32_t bHasPTP:1;
236 uint32_t bTailTaggingEnabled:1;
237 uint32_t bAwaitingResponse:1;
238 uint32_t bHadLink:1;
239 uint32_t bIBAEnabled;
240 uint16_t hIBAFrameType;
241 MACADR sw_addr;
242 uint8_t iba_seq_num;
243 uint16_t hAccessFormat;
244 BBI2C mmd;
245 uint32_t portIntfValid;
246 int swIntfIdx;
247 uint8_t lastPhyIrq[16];;
248 eLinkMode_t phyMode[16];
249 MACADR staticMacAddrs[16];
250
251 KSZ_SwPortIntf **portIntfs;
252 config_chooser *swCfg;
253
254 static void FirstLinkUp(InterfaceBlock *net_eth, bool up);
255 void init_phy_9563(int port);
256public:
257 IBAFrame *pIBABuf;
258
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);
265
266 int flush_txn();
267
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);
273
274 int ConfigurePortDefaultVID(uint8_t portnum, uint16_t vid, uint8_t prio, bool dropEligible);
275 void ResetVlan();
276 int ConfigureVlan(uint16_t vid, bool fwdOverride, uint8_t prio, uint16_t mask_untag, uint16_t mask_fwd);
277
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);
285
286
287 Phy_KSZ9893();
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;
302
303 const ksz_98xx_regs_t &reg() { return *(ksz_98xx_regs_t*)NULL; }
304};
305_PUSH_PHY_CLASS
306#undef _PHY_CLASS
307#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_KSZ9893
308
309class KSZ_SwPortIntf : public EtherLikeInterface {
310 EthernetVars &eth;
311 int portNum;
312 uint8_t portTagAlignBuf[0x10];
313 uint8_t * const pPortTag;
314 eLinkState_t linkState;
315 eLinkMode_t reqLinkMode;
316 bool bHadLink:1;
317
318 friend class Phy_KSZ9893;
319 eLinkState_t setLinkState(eLinkState_t newState);
320public:
321 ConfigEndMarker;
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));
326
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); }
330
331 virtual void send_func(PoolPtr poolPtr);
332 virtual void EnableMulticast(MACADR macAddress, BOOL addAddress);
333 virtual bool LinkActive();
334 virtual int LinkSpeed();
335 virtual bool LinkDuplex();
336 virtual eLinkState_t SetLinkMode(eLinkMode_t mode);
337 virtual eLinkMode_t GetLinkMode();
338 virtual eLinkState_t GetLink();
339};
340
341#endif /* ----- #ifndef __ETHER_PHY_KSZ9893_H ----- */
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