@@ -61,6 +61,7 @@ static const char *e1000_reg_to_string(enum e1000_reg_t r)
61
61
_ (TDT );
62
62
_ (RAL );
63
63
_ (RAH );
64
+ _ (ITR );
64
65
}
65
66
#undef _
66
67
LOG_ERR ("Unsupported register: 0x%x" , r );
@@ -103,31 +104,35 @@ static int e1000_tx(struct e1000_dev *dev, void *buf, size_t len)
103
104
{
104
105
hexdump (buf , len , "%zu byte(s)" , len );
105
106
106
- dev -> tx .addr = POINTER_TO_INT (buf );
107
- dev -> tx .len = len ;
108
- dev -> tx .cmd = TDESC_EOP | TDESC_RS ;
107
+ dev -> tx [dev -> next_tx_desc ].addr = POINTER_TO_INT (buf );
108
+ dev -> tx [dev -> next_tx_desc ].len = len ;
109
+ dev -> tx [dev -> next_tx_desc ].cmd = TDESC_EOP | TDESC_RS ;
110
+ dev -> tx [dev -> next_tx_desc ].sta = 0 ;
109
111
110
- iow32 ( dev , TDT , 1 ) ;
112
+ uint32_t old_tx_desc = dev -> next_tx_desc ;
111
113
112
- while (!(dev -> tx .sta )) {
114
+ dev -> next_tx_desc = (dev -> next_tx_desc + 1 ) % CONFIG_ETH_E1000_TX_QUEUE_SIZE ;
115
+ iow32 (dev , TDT , dev -> next_tx_desc );
116
+
117
+ while (!(dev -> tx [old_tx_desc ].sta )) {
113
118
k_yield ();
114
119
}
115
120
116
- LOG_DBG ("tx.sta: 0x%02hx" , dev -> tx .sta );
121
+ LOG_DBG ("tx.sta: 0x%02hx" , dev -> tx [ old_tx_desc ] .sta );
117
122
118
- return (dev -> tx .sta & TDESC_STA_DD ) ? 0 : - EIO ;
123
+ return (dev -> tx [ old_tx_desc ] .sta & TDESC_STA_DD ) ? 0 : - EIO ;
119
124
}
120
125
121
126
static int e1000_send (const struct device * ddev , struct net_pkt * pkt )
122
127
{
123
128
struct e1000_dev * dev = ddev -> data ;
124
129
size_t len = net_pkt_get_len (pkt );
125
130
126
- if (net_pkt_read (pkt , dev -> txb , len )) {
131
+ if (net_pkt_read (pkt , dev -> txb [ dev -> next_tx_desc ] , len )) {
127
132
return - EIO ;
128
133
}
129
134
130
- return e1000_tx (dev , dev -> txb , len );
135
+ return e1000_tx (dev , dev -> txb [ dev -> next_tx_desc ] , len );
131
136
}
132
137
133
138
static struct net_pkt * e1000_rx (struct e1000_dev * dev )
@@ -136,19 +141,18 @@ static struct net_pkt *e1000_rx(struct e1000_dev *dev)
136
141
void * buf ;
137
142
ssize_t len ;
138
143
139
- LOG_DBG ("rx.sta: 0x%02hx" , dev -> rx .sta );
144
+ LOG_DBG ("rx.sta: 0x%02hx" , dev -> rx [ dev -> next_rx_desc ] .sta );
140
145
141
- if (!(dev -> rx .sta & RDESC_STA_DD )) {
142
- LOG_ERR ("RX descriptor not ready" );
143
- goto out ;
146
+ if (!(dev -> rx [dev -> next_rx_desc ].sta & RDESC_STA_DD )) {
147
+ return NULL ;
144
148
}
145
149
146
- buf = INT_TO_POINTER ((uint32_t )dev -> rx .addr );
147
- len = dev -> rx .len - 4 ;
150
+ buf = INT_TO_POINTER ((uint32_t )dev -> rx [ dev -> next_rx_desc ] .addr );
151
+ len = dev -> rx [ dev -> next_rx_desc ] .len - 4 ;
148
152
149
153
if (len <= 0 ) {
150
- LOG_ERR ("Invalid RX descriptor length: %hu" , dev -> rx .len );
151
- goto out ;
154
+ LOG_ERR ("Invalid RX descriptor length: %hu" , dev -> rx [ dev -> next_rx_desc ] .len );
155
+ goto err ;
152
156
}
153
157
154
158
hexdump (buf , len , "%zd byte(s)" , len );
@@ -157,16 +161,24 @@ static struct net_pkt *e1000_rx(struct e1000_dev *dev)
157
161
K_NO_WAIT );
158
162
if (!pkt ) {
159
163
LOG_ERR ("Out of buffers" );
160
- goto out ;
164
+ goto err ;
161
165
}
162
166
163
167
if (net_pkt_write (pkt , buf , len )) {
164
168
LOG_ERR ("Out of memory for received frame" );
165
169
net_pkt_unref (pkt );
166
170
pkt = NULL ;
171
+ } else {
172
+ goto out ;
167
173
}
168
174
175
+ err :
176
+ eth_stats_update_errors_rx (get_iface (dev ));
169
177
out :
178
+ dev -> rx [dev -> next_rx_desc ].sta = 0 ;
179
+ iow32 (dev , RDT , dev -> next_rx_desc );
180
+ dev -> next_rx_desc = (dev -> next_rx_desc + 1 ) % CONFIG_ETH_E1000_RX_QUEUE_SIZE ;
181
+
170
182
return pkt ;
171
183
}
172
184
@@ -177,16 +189,14 @@ static void e1000_isr(const struct device *ddev)
177
189
178
190
icr &= ~(ICR_TXDW | ICR_TXQE );
179
191
180
- if (icr & ICR_RXO ) {
181
- struct net_pkt * pkt = e1000_rx (dev );
182
-
183
- icr &= ~ICR_RXO ;
192
+ if (icr & (ICR_RXO | ICR_RXDMT0 | ICR_RXT0 )) {
193
+ struct net_pkt * pkt = NULL ;
184
194
185
- if ( pkt ) {
195
+ while (( pkt = e1000_rx ( dev )) ) {
186
196
net_recv_data (get_iface (dev ), pkt );
187
- } else {
188
- eth_stats_update_errors_rx (get_iface (dev ));
189
197
}
198
+
199
+ icr &= ~(ICR_RXO | ICR_RXDMT0 | ICR_RXT0 );
190
200
}
191
201
192
202
if (icr ) {
@@ -213,30 +223,34 @@ int e1000_probe(const struct device *ddev)
213
223
device_map (& dev -> address , mbar .phys_addr , mbar .size ,
214
224
K_MEM_CACHE_NONE );
215
225
216
- /* Setup TX descriptor */
226
+ /* Setup TX descriptors */
217
227
218
- iow32 (dev , TDBAL , (uint32_t )POINTER_TO_UINT (& dev -> tx ));
219
- iow32 (dev , TDBAH , (uint32_t )((POINTER_TO_UINT (& dev -> tx ) >> 16 ) >> 16 ));
220
- iow32 (dev , TDLEN , 1 * 16 );
228
+ iow32 (dev , TDBAL , (uint32_t )POINTER_TO_UINT (& dev -> tx [ 0 ] ));
229
+ iow32 (dev , TDBAH , (uint32_t )((POINTER_TO_UINT (& dev -> tx [ 0 ] ) >> 16 ) >> 16 ));
230
+ iow32 (dev , TDLEN , ( uint32_t )( CONFIG_ETH_E1000_TX_QUEUE_SIZE * sizeof ( struct e1000_tx )) );
221
231
222
232
iow32 (dev , TDH , 0 );
223
233
iow32 (dev , TDT , 0 );
234
+ dev -> next_tx_desc = 0 ;
224
235
225
236
iow32 (dev , TCTL , TCTL_EN );
226
237
227
- /* Setup RX descriptor */
238
+ /* Setup RX descriptors */
228
239
229
- dev -> rx .addr = POINTER_TO_INT (dev -> rxb );
230
- dev -> rx .len = sizeof (dev -> rxb );
240
+ for (int i = 0 ; i < CONFIG_ETH_E1000_RX_QUEUE_SIZE ; i ++ ) {
241
+ dev -> rx [i ].addr = POINTER_TO_INT (dev -> rxb [i ]);
242
+ dev -> rx [i ].len = sizeof (dev -> rxb [i ]);
243
+ }
231
244
232
- iow32 (dev , RDBAL , (uint32_t )POINTER_TO_UINT (& dev -> rx ));
233
- iow32 (dev , RDBAH , (uint32_t )((POINTER_TO_UINT (& dev -> rx ) >> 16 ) >> 16 ));
234
- iow32 (dev , RDLEN , 1 * 16 );
245
+ iow32 (dev , RDBAL , (uint32_t )POINTER_TO_UINT (& dev -> rx [ 0 ] ));
246
+ iow32 (dev , RDBAH , (uint32_t )((POINTER_TO_UINT (& dev -> rx [ 0 ] ) >> 16 ) >> 16 ));
247
+ iow32 (dev , RDLEN , ( uint32_t )( CONFIG_ETH_E1000_RX_QUEUE_SIZE * sizeof ( struct e1000_rx )) );
235
248
236
249
iow32 (dev , RDH , 0 );
237
- iow32 (dev , RDT , 1 );
250
+ iow32 (dev , RDT , CONFIG_ETH_E1000_RX_QUEUE_SIZE - 1 );
251
+ dev -> next_rx_desc = 0 ;
238
252
239
- iow32 (dev , IMS , IMS_RXO );
253
+ iow32 (dev , IMS , IMS_RXDMT0 | IMS_RXO | IMS_RXT0 );
240
254
241
255
ral = ior32 (dev , RAL );
242
256
rah = ior32 (dev , RAH );
@@ -312,7 +326,8 @@ static const struct ethernet_api e1000_api = {
312
326
\
313
327
irq_enable(DT_INST_IRQN(inst)); \
314
328
iow32(dev, CTRL, CTRL_SLU); /* Set link up */ \
315
- iow32 (dev , RCTL , RCTL_EN | RCTL_MPE ); \
329
+ iow32 (dev , RCTL , RCTL_EN | RCTL_MPE | DT_INST_PROP (inst , rdmts ) << RDMTS_OFFSET ); \
330
+ iow32 (dev , ITR , DT_INST_PROP (inst , itr ) & (uint32_t )GENMASK (15 , 0 )); \
316
331
} \
317
332
\
318
333
static const struct e1000_config config_ ##inst = { \
0 commit comments