@@ -122,10 +122,17 @@ static inline u8 w5100_read_direct(struct w5100_priv *priv, u16 addr)
122
122
return ioread8 (priv -> base + (addr << CONFIG_WIZNET_BUS_SHIFT ));
123
123
}
124
124
125
+ static inline void __w5100_write_direct (struct w5100_priv * priv , u16 addr ,
126
+ u8 data )
127
+ {
128
+ iowrite8 (data , priv -> base + (addr << CONFIG_WIZNET_BUS_SHIFT ));
129
+ }
130
+
125
131
static inline void w5100_write_direct (struct w5100_priv * priv ,
126
132
u16 addr , u8 data )
127
133
{
128
- iowrite8 (data , priv -> base + (addr << CONFIG_WIZNET_BUS_SHIFT ));
134
+ __w5100_write_direct (priv , addr , data );
135
+ mmiowb ();
129
136
}
130
137
131
138
static u16 w5100_read16_direct (struct w5100_priv * priv , u16 addr )
@@ -138,8 +145,9 @@ static u16 w5100_read16_direct(struct w5100_priv *priv, u16 addr)
138
145
139
146
static void w5100_write16_direct (struct w5100_priv * priv , u16 addr , u16 data )
140
147
{
141
- w5100_write_direct (priv , addr , data >> 8 );
142
- w5100_write_direct (priv , addr + 1 , data );
148
+ __w5100_write_direct (priv , addr , data >> 8 );
149
+ __w5100_write_direct (priv , addr + 1 , data );
150
+ mmiowb ();
143
151
}
144
152
145
153
static void w5100_readbuf_direct (struct w5100_priv * priv ,
@@ -164,8 +172,9 @@ static void w5100_writebuf_direct(struct w5100_priv *priv,
164
172
for (i = 0 ; i < len ; i ++ , addr ++ ) {
165
173
if (unlikely (addr > W5100_TX_MEM_END ))
166
174
addr = W5100_TX_MEM_START ;
167
- w5100_write_direct (priv , addr , * buf ++ );
175
+ __w5100_write_direct (priv , addr , * buf ++ );
168
176
}
177
+ mmiowb ();
169
178
}
170
179
171
180
/*
@@ -186,7 +195,6 @@ static u8 w5100_read_indirect(struct w5100_priv *priv, u16 addr)
186
195
187
196
spin_lock_irqsave (& priv -> reg_lock , flags );
188
197
w5100_write16_direct (priv , W5100_IDM_AR , addr );
189
- mmiowb ();
190
198
data = w5100_read_direct (priv , W5100_IDM_DR );
191
199
spin_unlock_irqrestore (& priv -> reg_lock , flags );
192
200
@@ -199,9 +207,7 @@ static void w5100_write_indirect(struct w5100_priv *priv, u16 addr, u8 data)
199
207
200
208
spin_lock_irqsave (& priv -> reg_lock , flags );
201
209
w5100_write16_direct (priv , W5100_IDM_AR , addr );
202
- mmiowb ();
203
210
w5100_write_direct (priv , W5100_IDM_DR , data );
204
- mmiowb ();
205
211
spin_unlock_irqrestore (& priv -> reg_lock , flags );
206
212
}
207
213
@@ -212,7 +218,6 @@ static u16 w5100_read16_indirect(struct w5100_priv *priv, u16 addr)
212
218
213
219
spin_lock_irqsave (& priv -> reg_lock , flags );
214
220
w5100_write16_direct (priv , W5100_IDM_AR , addr );
215
- mmiowb ();
216
221
data = w5100_read_direct (priv , W5100_IDM_DR ) << 8 ;
217
222
data |= w5100_read_direct (priv , W5100_IDM_DR );
218
223
spin_unlock_irqrestore (& priv -> reg_lock , flags );
@@ -226,10 +231,8 @@ static void w5100_write16_indirect(struct w5100_priv *priv, u16 addr, u16 data)
226
231
227
232
spin_lock_irqsave (& priv -> reg_lock , flags );
228
233
w5100_write16_direct (priv , W5100_IDM_AR , addr );
229
- mmiowb ();
230
- w5100_write_direct (priv , W5100_IDM_DR , data >> 8 );
234
+ __w5100_write_direct (priv , W5100_IDM_DR , data >> 8 );
231
235
w5100_write_direct (priv , W5100_IDM_DR , data );
232
- mmiowb ();
233
236
spin_unlock_irqrestore (& priv -> reg_lock , flags );
234
237
}
235
238
@@ -242,13 +245,11 @@ static void w5100_readbuf_indirect(struct w5100_priv *priv,
242
245
243
246
spin_lock_irqsave (& priv -> reg_lock , flags );
244
247
w5100_write16_direct (priv , W5100_IDM_AR , addr );
245
- mmiowb ();
246
248
247
249
for (i = 0 ; i < len ; i ++ , addr ++ ) {
248
250
if (unlikely (addr > W5100_RX_MEM_END )) {
249
251
addr = W5100_RX_MEM_START ;
250
252
w5100_write16_direct (priv , W5100_IDM_AR , addr );
251
- mmiowb ();
252
253
}
253
254
* buf ++ = w5100_read_direct (priv , W5100_IDM_DR );
254
255
}
@@ -265,15 +266,13 @@ static void w5100_writebuf_indirect(struct w5100_priv *priv,
265
266
266
267
spin_lock_irqsave (& priv -> reg_lock , flags );
267
268
w5100_write16_direct (priv , W5100_IDM_AR , addr );
268
- mmiowb ();
269
269
270
270
for (i = 0 ; i < len ; i ++ , addr ++ ) {
271
271
if (unlikely (addr > W5100_TX_MEM_END )) {
272
272
addr = W5100_TX_MEM_START ;
273
273
w5100_write16_direct (priv , W5100_IDM_AR , addr );
274
- mmiowb ();
275
274
}
276
- w5100_write_direct (priv , W5100_IDM_DR , * buf ++ );
275
+ __w5100_write_direct (priv , W5100_IDM_DR , * buf ++ );
277
276
}
278
277
mmiowb ();
279
278
spin_unlock_irqrestore (& priv -> reg_lock , flags );
@@ -309,7 +308,6 @@ static int w5100_command(struct w5100_priv *priv, u16 cmd)
309
308
unsigned long timeout = jiffies + msecs_to_jiffies (100 );
310
309
311
310
w5100_write (priv , W5100_S0_CR , cmd );
312
- mmiowb ();
313
311
314
312
while (w5100_read (priv , W5100_S0_CR ) != 0 ) {
315
313
if (time_after (jiffies , timeout ))
@@ -327,18 +325,15 @@ static void w5100_write_macaddr(struct w5100_priv *priv)
327
325
328
326
for (i = 0 ; i < ETH_ALEN ; i ++ )
329
327
w5100_write (priv , W5100_SHAR + i , ndev -> dev_addr [i ]);
330
- mmiowb ();
331
328
}
332
329
333
330
static void w5100_hw_reset (struct w5100_priv * priv )
334
331
{
335
332
w5100_write_direct (priv , W5100_MR , MR_RST );
336
- mmiowb ();
337
333
mdelay (5 );
338
334
w5100_write_direct (priv , W5100_MR , priv -> indirect ?
339
335
MR_PB | MR_AI | MR_IND :
340
336
MR_PB );
341
- mmiowb ();
342
337
w5100_write (priv , W5100_IMR , 0 );
343
338
w5100_write_macaddr (priv );
344
339
@@ -347,23 +342,19 @@ static void w5100_hw_reset(struct w5100_priv *priv)
347
342
*/
348
343
w5100_write (priv , W5100_RMSR , 0x03 );
349
344
w5100_write (priv , W5100_TMSR , 0x03 );
350
- mmiowb ();
351
345
}
352
346
353
347
static void w5100_hw_start (struct w5100_priv * priv )
354
348
{
355
349
w5100_write (priv , W5100_S0_MR , priv -> promisc ?
356
350
S0_MR_MACRAW : S0_MR_MACRAW_MF );
357
- mmiowb ();
358
351
w5100_command (priv , S0_CR_OPEN );
359
352
w5100_write (priv , W5100_IMR , IR_S0 );
360
- mmiowb ();
361
353
}
362
354
363
355
static void w5100_hw_close (struct w5100_priv * priv )
364
356
{
365
357
w5100_write (priv , W5100_IMR , 0 );
366
- mmiowb ();
367
358
w5100_command (priv , S0_CR_CLOSE );
368
359
}
369
360
@@ -447,7 +438,6 @@ static int w5100_start_tx(struct sk_buff *skb, struct net_device *ndev)
447
438
offset = w5100_read16 (priv , W5100_S0_TX_WR );
448
439
w5100_writebuf (priv , offset , skb -> data , skb -> len );
449
440
w5100_write16 (priv , W5100_S0_TX_WR , offset + skb -> len );
450
- mmiowb ();
451
441
ndev -> stats .tx_bytes += skb -> len ;
452
442
ndev -> stats .tx_packets ++ ;
453
443
dev_kfree_skb (skb );
@@ -488,7 +478,6 @@ static int w5100_napi_poll(struct napi_struct *napi, int budget)
488
478
skb_put (skb , rx_len );
489
479
w5100_readbuf (priv , offset + 2 , skb -> data , rx_len );
490
480
w5100_write16 (priv , W5100_S0_RX_RD , offset + 2 + rx_len );
491
- mmiowb ();
492
481
w5100_command (priv , S0_CR_RECV );
493
482
skb -> protocol = eth_type_trans (skb , ndev );
494
483
@@ -500,7 +489,6 @@ static int w5100_napi_poll(struct napi_struct *napi, int budget)
500
489
if (rx_count < budget ) {
501
490
napi_complete (napi );
502
491
w5100_write (priv , W5100_IMR , IR_S0 );
503
- mmiowb ();
504
492
}
505
493
506
494
return rx_count ;
@@ -515,7 +503,6 @@ static irqreturn_t w5100_interrupt(int irq, void *ndev_instance)
515
503
if (!ir )
516
504
return IRQ_NONE ;
517
505
w5100_write (priv , W5100_S0_IR , ir );
518
- mmiowb ();
519
506
520
507
if (ir & S0_IR_SENDOK ) {
521
508
netif_dbg (priv , tx_done , ndev , "tx done\n" );
@@ -525,7 +512,6 @@ static irqreturn_t w5100_interrupt(int irq, void *ndev_instance)
525
512
if (ir & S0_IR_RECV ) {
526
513
if (napi_schedule_prep (& priv -> napi )) {
527
514
w5100_write (priv , W5100_IMR , 0 );
528
- mmiowb ();
529
515
__napi_schedule (& priv -> napi );
530
516
}
531
517
}
0 commit comments