.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * Ethernet driver for the WIZnet W5300 chip. |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2008-2009 WIZnet Co.,Ltd. |
---|
5 | 6 | * Copyright (C) 2011 Taehun Kim <kth3321 <at> gmail.com> |
---|
6 | 7 | * Copyright (C) 2012 Mike Sinkovsky <msink@permonline.ru> |
---|
7 | | - * |
---|
8 | | - * Licensed under the GPL-2 or later. |
---|
9 | 8 | */ |
---|
10 | 9 | |
---|
11 | 10 | #include <linux/kernel.h> |
---|
.. | .. |
---|
141 | 140 | |
---|
142 | 141 | spin_lock_irqsave(&priv->reg_lock, flags); |
---|
143 | 142 | w5300_write_direct(priv, W5300_IDM_AR, addr); |
---|
144 | | - mmiowb(); |
---|
145 | 143 | data = w5300_read_direct(priv, W5300_IDM_DR); |
---|
146 | 144 | spin_unlock_irqrestore(&priv->reg_lock, flags); |
---|
147 | 145 | |
---|
.. | .. |
---|
154 | 152 | |
---|
155 | 153 | spin_lock_irqsave(&priv->reg_lock, flags); |
---|
156 | 154 | w5300_write_direct(priv, W5300_IDM_AR, addr); |
---|
157 | | - mmiowb(); |
---|
158 | 155 | w5300_write_direct(priv, W5300_IDM_DR, data); |
---|
159 | | - mmiowb(); |
---|
160 | 156 | spin_unlock_irqrestore(&priv->reg_lock, flags); |
---|
161 | 157 | } |
---|
162 | 158 | |
---|
.. | .. |
---|
192 | 188 | unsigned long timeout = jiffies + msecs_to_jiffies(100); |
---|
193 | 189 | |
---|
194 | 190 | w5300_write(priv, W5300_S0_CR, cmd); |
---|
195 | | - mmiowb(); |
---|
196 | 191 | |
---|
197 | 192 | while (w5300_read(priv, W5300_S0_CR) != 0) { |
---|
198 | 193 | if (time_after(jiffies, timeout)) |
---|
.. | .. |
---|
241 | 236 | w5300_write(priv, W5300_SHARH, |
---|
242 | 237 | ndev->dev_addr[4] << 8 | |
---|
243 | 238 | ndev->dev_addr[5]); |
---|
244 | | - mmiowb(); |
---|
245 | 239 | } |
---|
246 | 240 | |
---|
247 | 241 | static void w5300_hw_reset(struct w5300_priv *priv) |
---|
248 | 242 | { |
---|
249 | 243 | w5300_write_direct(priv, W5300_MR, MR_RST); |
---|
250 | | - mmiowb(); |
---|
251 | 244 | mdelay(5); |
---|
252 | 245 | w5300_write_direct(priv, W5300_MR, priv->indirect ? |
---|
253 | 246 | MR_WDF(7) | MR_PB | MR_IND : |
---|
254 | 247 | MR_WDF(7) | MR_PB); |
---|
255 | | - mmiowb(); |
---|
256 | 248 | w5300_write(priv, W5300_IMR, 0); |
---|
257 | 249 | w5300_write_macaddr(priv); |
---|
258 | 250 | |
---|
.. | .. |
---|
264 | 256 | w5300_write32(priv, W5300_TMSRL, 64 << 24); |
---|
265 | 257 | w5300_write32(priv, W5300_TMSRH, 0); |
---|
266 | 258 | w5300_write(priv, W5300_MTYPE, 0x00ff); |
---|
267 | | - mmiowb(); |
---|
268 | 259 | } |
---|
269 | 260 | |
---|
270 | 261 | static void w5300_hw_start(struct w5300_priv *priv) |
---|
271 | 262 | { |
---|
272 | 263 | w5300_write(priv, W5300_S0_MR, priv->promisc ? |
---|
273 | 264 | S0_MR_MACRAW : S0_MR_MACRAW_MF); |
---|
274 | | - mmiowb(); |
---|
275 | 265 | w5300_command(priv, S0_CR_OPEN); |
---|
276 | 266 | w5300_write(priv, W5300_S0_IMR, S0_IR_RECV | S0_IR_SENDOK); |
---|
277 | 267 | w5300_write(priv, W5300_IMR, IR_S0); |
---|
278 | | - mmiowb(); |
---|
279 | 268 | } |
---|
280 | 269 | |
---|
281 | 270 | static void w5300_hw_close(struct w5300_priv *priv) |
---|
282 | 271 | { |
---|
283 | 272 | w5300_write(priv, W5300_IMR, 0); |
---|
284 | | - mmiowb(); |
---|
285 | 273 | w5300_command(priv, S0_CR_CLOSE); |
---|
286 | 274 | } |
---|
287 | 275 | |
---|
.. | .. |
---|
353 | 341 | } |
---|
354 | 342 | } |
---|
355 | 343 | |
---|
356 | | -static void w5300_tx_timeout(struct net_device *ndev) |
---|
| 344 | +static void w5300_tx_timeout(struct net_device *ndev, unsigned int txqueue) |
---|
357 | 345 | { |
---|
358 | 346 | struct w5300_priv *priv = netdev_priv(ndev); |
---|
359 | 347 | |
---|
.. | .. |
---|
372 | 360 | netif_stop_queue(ndev); |
---|
373 | 361 | |
---|
374 | 362 | w5300_write_frame(priv, skb->data, skb->len); |
---|
375 | | - mmiowb(); |
---|
376 | 363 | ndev->stats.tx_packets++; |
---|
377 | 364 | ndev->stats.tx_bytes += skb->len; |
---|
378 | 365 | dev_kfree_skb(skb); |
---|
.. | .. |
---|
419 | 406 | if (rx_count < budget) { |
---|
420 | 407 | napi_complete_done(napi, rx_count); |
---|
421 | 408 | w5300_write(priv, W5300_IMR, IR_S0); |
---|
422 | | - mmiowb(); |
---|
423 | 409 | } |
---|
424 | 410 | |
---|
425 | 411 | return rx_count; |
---|
.. | .. |
---|
434 | 420 | if (!ir) |
---|
435 | 421 | return IRQ_NONE; |
---|
436 | 422 | w5300_write(priv, W5300_S0_IR, ir); |
---|
437 | | - mmiowb(); |
---|
438 | 423 | |
---|
439 | 424 | if (ir & S0_IR_SENDOK) { |
---|
440 | 425 | netif_dbg(priv, tx_done, ndev, "tx done\n"); |
---|
.. | .. |
---|
444 | 429 | if (ir & S0_IR_RECV) { |
---|
445 | 430 | if (napi_schedule_prep(&priv->napi)) { |
---|
446 | 431 | w5300_write(priv, W5300_IMR, 0); |
---|
447 | | - mmiowb(); |
---|
448 | 432 | __napi_schedule(&priv->napi); |
---|
449 | 433 | } |
---|
450 | 434 | } |
---|
.. | .. |
---|
661 | 645 | #ifdef CONFIG_PM_SLEEP |
---|
662 | 646 | static int w5300_suspend(struct device *dev) |
---|
663 | 647 | { |
---|
664 | | - struct platform_device *pdev = to_platform_device(dev); |
---|
665 | | - struct net_device *ndev = platform_get_drvdata(pdev); |
---|
| 648 | + struct net_device *ndev = dev_get_drvdata(dev); |
---|
666 | 649 | struct w5300_priv *priv = netdev_priv(ndev); |
---|
667 | 650 | |
---|
668 | 651 | if (netif_running(ndev)) { |
---|
.. | .. |
---|
676 | 659 | |
---|
677 | 660 | static int w5300_resume(struct device *dev) |
---|
678 | 661 | { |
---|
679 | | - struct platform_device *pdev = to_platform_device(dev); |
---|
680 | | - struct net_device *ndev = platform_get_drvdata(pdev); |
---|
| 662 | + struct net_device *ndev = dev_get_drvdata(dev); |
---|
681 | 663 | struct w5300_priv *priv = netdev_priv(ndev); |
---|
682 | 664 | |
---|
683 | 665 | if (!netif_running(ndev)) { |
---|