NetBurner 3.5.8
PDF Version
ether_phy.h
1#ifndef __ETHER_PHYS_H
2#define __ETHER_PHYS_H
3/*NB_REVISION*/
4
5/*NB_COPYRIGHT*/
6#include <predef.h>
7#include <stdint.h>
8#include <nettypes.h>
9#include <ether_consts.h>
10
11class EthernetVars;
12
13class EtherPhy {
14 static EthernetVars *allocatingStruct; // for use by the class 'new'
15 void * operator new(size_t size);
16protected:
17 EthernetVars &eth;
18 uint32_t currentPage;
19 uint32_t driver_state; // Storage for a generic phy driver state. Not necessarily used.
20public:
21 EtherPhy();
22 inline uint32_t getState() { return driver_state; }
23 virtual uint16_t ProcessIRQ();
24 virtual eLinkState_t SetLinkMode(eLinkMode_t mode);
25 virtual eLinkMode_t GetLinkMode();
26 virtual eLinkState_t GetLink();
27 virtual eLinkState_t GetMacLink(); // This is the link state needed for the MAC
28 // configuration. For a normal PHY, it's the same as
29 // 'GetLink', but for a smart NIC or switch
30 // it may not be.
31 virtual void SetMIIMode(eMIIMode_t mode);
32 virtual void IRQMask(uint16_t IRQMask, bool setNotClr);
33 virtual void Enable();
34 virtual void Disable();
35
36 virtual void FinalizeFrame(PoolPtr pb, int64_t egress_port_mask, int qos, bool force);
37 virtual bool DoRx(PoolPtr pb, uint16_t *rx_len, int *logical_rx_ifnum); // rx_len and ifnum may be modified by DoRx, do not pass non-frame-specific variables
38
39 virtual void ShowMII();
40
41 friend class EthernetVars;
42};
43
44
45#define _PUSH_PHY_CLASS _Pragma("push_macro(\"_PHY_CLASS\")")
46#define _POP_PHY_CLASS _Pragma("pop_macro(\"_PHY_CLASS\")")
47
48class Phy_KSZ8041 : public EtherPhy {
49public:
50 Phy_KSZ8041();
51
52 virtual eLinkState_t SetLinkMode(eLinkMode_t mode) override;
53 virtual eLinkMode_t GetLinkMode() override;
54 virtual eLinkState_t GetLink() override;
55 virtual void Disable() override;
56 virtual void Enable() override;
57};
58#define _PHY_CLASS Phy_KSZ8041
59
60class Phy_KSZ8081 : public EtherPhy {
61public:
62 Phy_KSZ8081();
63
64 virtual eLinkState_t SetLinkMode(eLinkMode_t mode) override;
65 virtual eLinkMode_t GetLinkMode() override;
66 virtual eLinkState_t GetLink() override;
67 virtual void SetMIIMode(eMIIMode_t mode) override;
68 virtual void Disable() override;
69 virtual void Enable() override;
70};
71_PUSH_PHY_CLASS
72#undef _PHY_CLASS
73#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_KSZ8081
74
75class Phy_AMD : public EtherPhy {
76public:
77 Phy_AMD();
78 virtual eLinkState_t GetLink() override;
79};
80_PUSH_PHY_CLASS
81#undef _PHY_CLASS
82#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_AMD
83
84class Phy_National : public EtherPhy {
85public:
86 Phy_National();
87 virtual eLinkState_t GetLink() override;
88};
89_PUSH_PHY_CLASS
90#undef _PHY_CLASS
91#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_National
92
93class Phy_DP83825I : public EtherPhy {
94public:
95 Phy_DP83825I();
96 virtual void ShowMII() override;
97 virtual uint16_t ProcessIRQ() override;
98 virtual eLinkState_t GetLink() override;
99 virtual eLinkState_t SetLinkMode(eLinkMode_t mode) override;
100 virtual eLinkMode_t GetLinkMode() override;
101 virtual void IRQMask(uint16_t mask, bool setNotClr) override;
102 virtual void Disable() override;
103 virtual void Enable() override;
104};
105_PUSH_PHY_CLASS
106#undef _PHY_CLASS
107#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_DP83825I
108
109class Phy_RTL8211 : public EtherPhy {
110public:
111 Phy_RTL8211();
112 virtual uint16_t ProcessIRQ() override;
113 virtual eLinkState_t GetLink() override;
114 virtual eLinkState_t SetLinkMode(eLinkMode_t mode) override;
115 virtual eLinkMode_t GetLinkMode() override;
116 virtual void IRQMask(uint16_t mask, bool setNotClr) override;
117 virtual void Disable() override;
118 virtual void Enable() override;
119};
120_PUSH_PHY_CLASS
121#undef _PHY_CLASS
122#define _PHY_CLASS _POP_PHY_CLASS _PHY_CLASS, Phy_RTL8211
123
124#include <ether_phy_ksz9893.h>
125
126#include <algorithm>
127template<typename... Ts>
128struct _max_sizeof : std::integral_constant<std::size_t, std::max({sizeof(Ts)...})> {};
129
130
131static constexpr size_t ETHER_PHY_MAX_SIZE =
132 _max_sizeof<_PHY_CLASS>();
133
134#endif /* ----- #ifndef __ETHER_PHYS_H ----- */