@@ -19,13 +19,22 @@ static struct mac_ops rpm_mac_ops = {
19
19
.lmac_fwi = RPM_LMAC_FWI ,
20
20
.non_contiguous_serdes_lane = true,
21
21
.get_nr_lmacs = rpm_get_nr_lmacs ,
22
+ .mac_enadis_rx_pause_fwding = rpm_lmac_enadis_rx_pause_fwding ,
23
+ .mac_get_pause_frm_status = rpm_lmac_get_pause_frm_status ,
24
+ .mac_enadis_pause_frm = rpm_lmac_enadis_pause_frm ,
25
+ .mac_pause_frm_config = rpm_lmac_pause_frm_config ,
22
26
};
23
27
24
28
struct mac_ops * rpm_get_mac_ops (void )
25
29
{
26
30
return & rpm_mac_ops ;
27
31
}
28
32
33
+ static void rpm_write (rpm_t * rpm , u64 lmac , u64 offset , u64 val )
34
+ {
35
+ cgx_write (rpm , lmac , offset , val );
36
+ }
37
+
29
38
static u64 rpm_read (rpm_t * rpm , u64 lmac , u64 offset )
30
39
{
31
40
return cgx_read (rpm , lmac , offset );
@@ -37,3 +46,128 @@ int rpm_get_nr_lmacs(void *rpmd)
37
46
38
47
return hweight8 (rpm_read (rpm , 0 , CGXX_CMRX_RX_LMACS ) & 0xFULL );
39
48
}
49
+
50
+ void rpm_lmac_enadis_rx_pause_fwding (void * rpmd , int lmac_id , bool enable )
51
+ {
52
+ struct cgx * rpm = rpmd ;
53
+ u64 cfg ;
54
+
55
+ if (!rpm )
56
+ return ;
57
+
58
+ if (enable ) {
59
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
60
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
61
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
62
+ } else {
63
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
64
+ cfg |= RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
65
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
66
+ }
67
+ }
68
+
69
+ int rpm_lmac_get_pause_frm_status (void * rpmd , int lmac_id ,
70
+ u8 * tx_pause , u8 * rx_pause )
71
+ {
72
+ rpm_t * rpm = rpmd ;
73
+ u64 cfg ;
74
+
75
+ if (!is_lmac_valid (rpm , lmac_id ))
76
+ return - ENODEV ;
77
+
78
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
79
+ * rx_pause = !(cfg & RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE );
80
+
81
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
82
+ * tx_pause = !(cfg & RPMX_MTI_MAC100X_COMMAND_CONFIG_TX_P_DISABLE );
83
+ return 0 ;
84
+ }
85
+
86
+ int rpm_lmac_enadis_pause_frm (void * rpmd , int lmac_id , u8 tx_pause ,
87
+ u8 rx_pause )
88
+ {
89
+ rpm_t * rpm = rpmd ;
90
+ u64 cfg ;
91
+
92
+ if (!is_lmac_valid (rpm , lmac_id ))
93
+ return - ENODEV ;
94
+
95
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
96
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE ;
97
+ cfg |= rx_pause ? 0x0 : RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE ;
98
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
99
+ cfg |= rx_pause ? 0x0 : RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
100
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
101
+
102
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
103
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_TX_P_DISABLE ;
104
+ cfg |= tx_pause ? 0x0 : RPMX_MTI_MAC100X_COMMAND_CONFIG_TX_P_DISABLE ;
105
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
106
+
107
+ cfg = rpm_read (rpm , 0 , RPMX_CMR_RX_OVR_BP );
108
+ if (tx_pause ) {
109
+ cfg &= ~RPMX_CMR_RX_OVR_BP_EN (lmac_id );
110
+ } else {
111
+ cfg |= RPMX_CMR_RX_OVR_BP_EN (lmac_id );
112
+ cfg &= ~RPMX_CMR_RX_OVR_BP_BP (lmac_id );
113
+ }
114
+ rpm_write (rpm , 0 , RPMX_CMR_RX_OVR_BP , cfg );
115
+ return 0 ;
116
+ }
117
+
118
+ void rpm_lmac_pause_frm_config (void * rpmd , int lmac_id , bool enable )
119
+ {
120
+ rpm_t * rpm = rpmd ;
121
+ u64 cfg ;
122
+
123
+ if (enable ) {
124
+ /* Enable 802.3 pause frame mode */
125
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
126
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_PFC_MODE ;
127
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
128
+
129
+ /* Enable receive pause frames */
130
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
131
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE ;
132
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
133
+
134
+ /* Enable forward pause to TX block */
135
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
136
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
137
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
138
+
139
+ /* Enable pause frames transmission */
140
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
141
+ cfg &= ~RPMX_MTI_MAC100X_COMMAND_CONFIG_TX_P_DISABLE ;
142
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
143
+
144
+ /* Set pause time and interval */
145
+ cfg = rpm_read (rpm , lmac_id ,
146
+ RPMX_MTI_MAC100X_CL01_PAUSE_QUANTA );
147
+ cfg &= ~0xFFFFULL ;
148
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_CL01_PAUSE_QUANTA ,
149
+ cfg | RPM_DEFAULT_PAUSE_TIME );
150
+ /* Set pause interval as the hardware default is too short */
151
+ cfg = rpm_read (rpm , lmac_id ,
152
+ RPMX_MTI_MAC100X_CL01_QUANTA_THRESH );
153
+ cfg &= ~0xFFFFULL ;
154
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_CL01_QUANTA_THRESH ,
155
+ cfg | (RPM_DEFAULT_PAUSE_TIME / 2 ));
156
+
157
+ } else {
158
+ /* ALL pause frames received are completely ignored */
159
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
160
+ cfg |= RPMX_MTI_MAC100X_COMMAND_CONFIG_RX_P_DISABLE ;
161
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
162
+
163
+ /* Disable forward pause to TX block */
164
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
165
+ cfg |= RPMX_MTI_MAC100X_COMMAND_CONFIG_PAUSE_IGNORE ;
166
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
167
+
168
+ /* Disable pause frames transmission */
169
+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
170
+ cfg |= RPMX_MTI_MAC100X_COMMAND_CONFIG_TX_P_DISABLE ;
171
+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
172
+ }
173
+ }
0 commit comments