| .. | .. |
|---|
| 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)) { |
|---|