diff options
254 files changed, 2657 insertions, 1943 deletions
diff --git a/Documentation/devicetree/bindings/mtd/atmel-nand.txt b/Documentation/devicetree/bindings/mtd/atmel-nand.txt index 5903ecf6e895..a20069502f5a 100644 --- a/Documentation/devicetree/bindings/mtd/atmel-nand.txt +++ b/Documentation/devicetree/bindings/mtd/atmel-nand.txt | |||
| @@ -27,13 +27,13 @@ nand0: nand@40000000,0 { | |||
| 27 | reg = <0x40000000 0x10000000 | 27 | reg = <0x40000000 0x10000000 |
| 28 | 0xffffe800 0x200 | 28 | 0xffffe800 0x200 |
| 29 | >; | 29 | >; |
| 30 | atmel,nand-addr-offset = <21>; | 30 | atmel,nand-addr-offset = <21>; /* ale */ |
| 31 | atmel,nand-cmd-offset = <22>; | 31 | atmel,nand-cmd-offset = <22>; /* cle */ |
| 32 | nand-on-flash-bbt; | 32 | nand-on-flash-bbt; |
| 33 | nand-ecc-mode = "soft"; | 33 | nand-ecc-mode = "soft"; |
| 34 | gpios = <&pioC 13 0 | 34 | gpios = <&pioC 13 0 /* rdy */ |
| 35 | &pioC 14 0 | 35 | &pioC 14 0 /* nce */ |
| 36 | 0 | 36 | 0 /* cd */ |
| 37 | >; | 37 | >; |
| 38 | partition@0 { | 38 | partition@0 { |
| 39 | ... | 39 | ... |
diff --git a/Documentation/networking/driver.txt b/Documentation/networking/driver.txt index 03283daa64fe..da59e2884130 100644 --- a/Documentation/networking/driver.txt +++ b/Documentation/networking/driver.txt | |||
| @@ -2,16 +2,16 @@ Document about softnet driver issues | |||
| 2 | 2 | ||
| 3 | Transmit path guidelines: | 3 | Transmit path guidelines: |
| 4 | 4 | ||
| 5 | 1) The hard_start_xmit method must never return '1' under any | 5 | 1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under |
| 6 | normal circumstances. It is considered a hard error unless | 6 | any normal circumstances. It is considered a hard error unless |
| 7 | there is no way your device can tell ahead of time when it's | 7 | there is no way your device can tell ahead of time when it's |
| 8 | transmit function will become busy. | 8 | transmit function will become busy. |
| 9 | 9 | ||
| 10 | Instead it must maintain the queue properly. For example, | 10 | Instead it must maintain the queue properly. For example, |
| 11 | for a driver implementing scatter-gather this means: | 11 | for a driver implementing scatter-gather this means: |
| 12 | 12 | ||
| 13 | static int drv_hard_start_xmit(struct sk_buff *skb, | 13 | static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb, |
| 14 | struct net_device *dev) | 14 | struct net_device *dev) |
| 15 | { | 15 | { |
| 16 | struct drv *dp = netdev_priv(dev); | 16 | struct drv *dp = netdev_priv(dev); |
| 17 | 17 | ||
| @@ -23,7 +23,7 @@ Transmit path guidelines: | |||
| 23 | unlock_tx(dp); | 23 | unlock_tx(dp); |
| 24 | printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", | 24 | printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", |
| 25 | dev->name); | 25 | dev->name); |
| 26 | return 1; | 26 | return NETDEV_TX_BUSY; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | ... queue packet to card ... | 29 | ... queue packet to card ... |
| @@ -35,6 +35,7 @@ Transmit path guidelines: | |||
| 35 | ... | 35 | ... |
| 36 | unlock_tx(dp); | 36 | unlock_tx(dp); |
| 37 | ... | 37 | ... |
| 38 | return NETDEV_TX_OK; | ||
| 38 | } | 39 | } |
| 39 | 40 | ||
| 40 | And then at the end of your TX reclamation event handling: | 41 | And then at the end of your TX reclamation event handling: |
| @@ -58,15 +59,12 @@ Transmit path guidelines: | |||
| 58 | TX_BUFFS_AVAIL(dp) > 0) | 59 | TX_BUFFS_AVAIL(dp) > 0) |
| 59 | netif_wake_queue(dp->dev); | 60 | netif_wake_queue(dp->dev); |
| 60 | 61 | ||
| 61 | 2) Do not forget to update netdev->trans_start to jiffies after | 62 | 2) An ndo_start_xmit method must not modify the shared parts of a |
| 62 | each new tx packet is given to the hardware. | ||
| 63 | |||
| 64 | 3) A hard_start_xmit method must not modify the shared parts of a | ||
| 65 | cloned SKB. | 63 | cloned SKB. |
| 66 | 64 | ||
| 67 | 4) Do not forget that once you return 0 from your hard_start_xmit | 65 | 3) Do not forget that once you return NETDEV_TX_OK from your |
| 68 | method, it is your driver's responsibility to free up the SKB | 66 | ndo_start_xmit method, it is your driver's responsibility to free |
| 69 | and in some finite amount of time. | 67 | up the SKB and in some finite amount of time. |
| 70 | 68 | ||
| 71 | For example, this means that it is not allowed for your TX | 69 | For example, this means that it is not allowed for your TX |
| 72 | mitigation scheme to let TX packets "hang out" in the TX | 70 | mitigation scheme to let TX packets "hang out" in the TX |
| @@ -74,8 +72,9 @@ Transmit path guidelines: | |||
| 74 | This error can deadlock sockets waiting for send buffer room | 72 | This error can deadlock sockets waiting for send buffer room |
| 75 | to be freed up. | 73 | to be freed up. |
| 76 | 74 | ||
| 77 | If you return 1 from the hard_start_xmit method, you must not keep | 75 | If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you |
| 78 | any reference to that SKB and you must not attempt to free it up. | 76 | must not keep any reference to that SKB and you must not attempt |
| 77 | to free it up. | ||
| 79 | 78 | ||
| 80 | Probing guidelines: | 79 | Probing guidelines: |
| 81 | 80 | ||
| @@ -85,10 +84,10 @@ Probing guidelines: | |||
| 85 | 84 | ||
| 86 | Close/stop guidelines: | 85 | Close/stop guidelines: |
| 87 | 86 | ||
| 88 | 1) After the dev->stop routine has been called, the hardware must | 87 | 1) After the ndo_stop routine has been called, the hardware must |
| 89 | not receive or transmit any data. All in flight packets must | 88 | not receive or transmit any data. All in flight packets must |
| 90 | be aborted. If necessary, poll or wait for completion of | 89 | be aborted. If necessary, poll or wait for completion of |
| 91 | any reset commands. | 90 | any reset commands. |
| 92 | 91 | ||
| 93 | 2) The dev->stop routine will be called by unregister_netdevice | 92 | 2) The ndo_stop routine will be called by unregister_netdevice |
| 94 | if device is still UP. | 93 | if device is still UP. |
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index ad3e80e17b4f..bd80ba5847d2 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -604,15 +604,8 @@ IP Variables: | |||
| 604 | ip_local_port_range - 2 INTEGERS | 604 | ip_local_port_range - 2 INTEGERS |
| 605 | Defines the local port range that is used by TCP and UDP to | 605 | Defines the local port range that is used by TCP and UDP to |
| 606 | choose the local port. The first number is the first, the | 606 | choose the local port. The first number is the first, the |
| 607 | second the last local port number. Default value depends on | 607 | second the last local port number. The default values are |
| 608 | amount of memory available on the system: | 608 | 32768 and 61000 respectively. |
| 609 | > 128Mb 32768-61000 | ||
| 610 | < 128Mb 1024-4999 or even less. | ||
| 611 | This number defines number of active connections, which this | ||
| 612 | system can issue simultaneously to systems not supporting | ||
| 613 | TCP extensions (timestamps). With tcp_tw_recycle enabled | ||
| 614 | (i.e. by default) range 1024-4999 is enough to issue up to | ||
| 615 | 2000 connections per second to systems supporting timestamps. | ||
| 616 | 609 | ||
| 617 | ip_local_reserved_ports - list of comma separated ranges | 610 | ip_local_reserved_ports - list of comma separated ranges |
| 618 | Specify the ports which are reserved for known third-party | 611 | Specify the ports which are reserved for known third-party |
diff --git a/Documentation/networking/netdevices.txt b/Documentation/networking/netdevices.txt index 89358341682a..c7ecc7080494 100644 --- a/Documentation/networking/netdevices.txt +++ b/Documentation/networking/netdevices.txt | |||
| @@ -47,26 +47,25 @@ packets is preferred. | |||
| 47 | 47 | ||
| 48 | struct net_device synchronization rules | 48 | struct net_device synchronization rules |
| 49 | ======================================= | 49 | ======================================= |
| 50 | dev->open: | 50 | ndo_open: |
| 51 | Synchronization: rtnl_lock() semaphore. | 51 | Synchronization: rtnl_lock() semaphore. |
| 52 | Context: process | 52 | Context: process |
| 53 | 53 | ||
| 54 | dev->stop: | 54 | ndo_stop: |
| 55 | Synchronization: rtnl_lock() semaphore. | 55 | Synchronization: rtnl_lock() semaphore. |
| 56 | Context: process | 56 | Context: process |
| 57 | Note1: netif_running() is guaranteed false | 57 | Note: netif_running() is guaranteed false |
| 58 | Note2: dev->poll() is guaranteed to be stopped | ||
| 59 | 58 | ||
| 60 | dev->do_ioctl: | 59 | ndo_do_ioctl: |
| 61 | Synchronization: rtnl_lock() semaphore. | 60 | Synchronization: rtnl_lock() semaphore. |
| 62 | Context: process | 61 | Context: process |
| 63 | 62 | ||
| 64 | dev->get_stats: | 63 | ndo_get_stats: |
| 65 | Synchronization: dev_base_lock rwlock. | 64 | Synchronization: dev_base_lock rwlock. |
| 66 | Context: nominally process, but don't sleep inside an rwlock | 65 | Context: nominally process, but don't sleep inside an rwlock |
| 67 | 66 | ||
| 68 | dev->hard_start_xmit: | 67 | ndo_start_xmit: |
| 69 | Synchronization: netif_tx_lock spinlock. | 68 | Synchronization: __netif_tx_lock spinlock. |
| 70 | 69 | ||
| 71 | When the driver sets NETIF_F_LLTX in dev->features this will be | 70 | When the driver sets NETIF_F_LLTX in dev->features this will be |
| 72 | called without holding netif_tx_lock. In this case the driver | 71 | called without holding netif_tx_lock. In this case the driver |
| @@ -87,20 +86,20 @@ dev->hard_start_xmit: | |||
| 87 | o NETDEV_TX_LOCKED Locking failed, please retry quickly. | 86 | o NETDEV_TX_LOCKED Locking failed, please retry quickly. |
| 88 | Only valid when NETIF_F_LLTX is set. | 87 | Only valid when NETIF_F_LLTX is set. |
| 89 | 88 | ||
| 90 | dev->tx_timeout: | 89 | ndo_tx_timeout: |
| 91 | Synchronization: netif_tx_lock spinlock. | 90 | Synchronization: netif_tx_lock spinlock; all TX queues frozen. |
| 92 | Context: BHs disabled | 91 | Context: BHs disabled |
| 93 | Notes: netif_queue_stopped() is guaranteed true | 92 | Notes: netif_queue_stopped() is guaranteed true |
| 94 | 93 | ||
| 95 | dev->set_rx_mode: | 94 | ndo_set_rx_mode: |
| 96 | Synchronization: netif_tx_lock spinlock. | 95 | Synchronization: netif_addr_lock spinlock. |
| 97 | Context: BHs disabled | 96 | Context: BHs disabled |
| 98 | 97 | ||
| 99 | struct napi_struct synchronization rules | 98 | struct napi_struct synchronization rules |
| 100 | ======================================== | 99 | ======================================== |
| 101 | napi->poll: | 100 | napi->poll: |
| 102 | Synchronization: NAPI_STATE_SCHED bit in napi->state. Device | 101 | Synchronization: NAPI_STATE_SCHED bit in napi->state. Device |
| 103 | driver's dev->close method will invoke napi_disable() on | 102 | driver's ndo_stop method will invoke napi_disable() on |
| 104 | all NAPI instances which will do a sleeping poll on the | 103 | all NAPI instances which will do a sleeping poll on the |
| 105 | NAPI_STATE_SCHED napi->state bit, waiting for all pending | 104 | NAPI_STATE_SCHED napi->state bit, waiting for all pending |
| 106 | NAPI activity to cease. | 105 | NAPI activity to cease. |
diff --git a/MAINTAINERS b/MAINTAINERS index 962232d62781..2dcfca850639 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -228,7 +228,7 @@ M: Len Brown <lenb@kernel.org> | |||
| 228 | L: linux-acpi@vger.kernel.org | 228 | L: linux-acpi@vger.kernel.org |
| 229 | W: http://www.lesswatts.org/projects/acpi/ | 229 | W: http://www.lesswatts.org/projects/acpi/ |
| 230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ | 230 | Q: http://patchwork.kernel.org/project/linux-acpi/list/ |
| 231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git | 231 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux |
| 232 | S: Supported | 232 | S: Supported |
| 233 | F: drivers/acpi/ | 233 | F: drivers/acpi/ |
| 234 | F: drivers/pnp/pnpacpi/ | 234 | F: drivers/pnp/pnpacpi/ |
| @@ -2450,17 +2450,17 @@ F: fs/ecryptfs/ | |||
| 2450 | 2450 | ||
| 2451 | EDAC-CORE | 2451 | EDAC-CORE |
| 2452 | M: Doug Thompson <dougthompson@xmission.com> | 2452 | M: Doug Thompson <dougthompson@xmission.com> |
| 2453 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2453 | L: linux-edac@vger.kernel.org |
| 2454 | W: bluesmoke.sourceforge.net | 2454 | W: bluesmoke.sourceforge.net |
| 2455 | S: Supported | 2455 | S: Supported |
| 2456 | F: Documentation/edac.txt | 2456 | F: Documentation/edac.txt |
| 2457 | F: drivers/edac/edac_* | 2457 | F: drivers/edac/ |
| 2458 | F: include/linux/edac.h | 2458 | F: include/linux/edac.h |
| 2459 | 2459 | ||
| 2460 | EDAC-AMD64 | 2460 | EDAC-AMD64 |
| 2461 | M: Doug Thompson <dougthompson@xmission.com> | 2461 | M: Doug Thompson <dougthompson@xmission.com> |
| 2462 | M: Borislav Petkov <borislav.petkov@amd.com> | 2462 | M: Borislav Petkov <borislav.petkov@amd.com> |
| 2463 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2463 | L: linux-edac@vger.kernel.org |
| 2464 | W: bluesmoke.sourceforge.net | 2464 | W: bluesmoke.sourceforge.net |
| 2465 | S: Supported | 2465 | S: Supported |
| 2466 | F: drivers/edac/amd64_edac* | 2466 | F: drivers/edac/amd64_edac* |
| @@ -2468,35 +2468,35 @@ F: drivers/edac/amd64_edac* | |||
| 2468 | EDAC-E752X | 2468 | EDAC-E752X |
| 2469 | M: Mark Gross <mark.gross@intel.com> | 2469 | M: Mark Gross <mark.gross@intel.com> |
| 2470 | M: Doug Thompson <dougthompson@xmission.com> | 2470 | M: Doug Thompson <dougthompson@xmission.com> |
| 2471 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2471 | L: linux-edac@vger.kernel.org |
| 2472 | W: bluesmoke.sourceforge.net | 2472 | W: bluesmoke.sourceforge.net |
| 2473 | S: Maintained | 2473 | S: Maintained |
| 2474 | F: drivers/edac/e752x_edac.c | 2474 | F: drivers/edac/e752x_edac.c |
| 2475 | 2475 | ||
| 2476 | EDAC-E7XXX | 2476 | EDAC-E7XXX |
| 2477 | M: Doug Thompson <dougthompson@xmission.com> | 2477 | M: Doug Thompson <dougthompson@xmission.com> |
| 2478 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2478 | L: linux-edac@vger.kernel.org |
| 2479 | W: bluesmoke.sourceforge.net | 2479 | W: bluesmoke.sourceforge.net |
| 2480 | S: Maintained | 2480 | S: Maintained |
| 2481 | F: drivers/edac/e7xxx_edac.c | 2481 | F: drivers/edac/e7xxx_edac.c |
| 2482 | 2482 | ||
| 2483 | EDAC-I82443BXGX | 2483 | EDAC-I82443BXGX |
| 2484 | M: Tim Small <tim@buttersideup.com> | 2484 | M: Tim Small <tim@buttersideup.com> |
| 2485 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2485 | L: linux-edac@vger.kernel.org |
| 2486 | W: bluesmoke.sourceforge.net | 2486 | W: bluesmoke.sourceforge.net |
| 2487 | S: Maintained | 2487 | S: Maintained |
| 2488 | F: drivers/edac/i82443bxgx_edac.c | 2488 | F: drivers/edac/i82443bxgx_edac.c |
| 2489 | 2489 | ||
| 2490 | EDAC-I3000 | 2490 | EDAC-I3000 |
| 2491 | M: Jason Uhlenkott <juhlenko@akamai.com> | 2491 | M: Jason Uhlenkott <juhlenko@akamai.com> |
| 2492 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2492 | L: linux-edac@vger.kernel.org |
| 2493 | W: bluesmoke.sourceforge.net | 2493 | W: bluesmoke.sourceforge.net |
| 2494 | S: Maintained | 2494 | S: Maintained |
| 2495 | F: drivers/edac/i3000_edac.c | 2495 | F: drivers/edac/i3000_edac.c |
| 2496 | 2496 | ||
| 2497 | EDAC-I5000 | 2497 | EDAC-I5000 |
| 2498 | M: Doug Thompson <dougthompson@xmission.com> | 2498 | M: Doug Thompson <dougthompson@xmission.com> |
| 2499 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2499 | L: linux-edac@vger.kernel.org |
| 2500 | W: bluesmoke.sourceforge.net | 2500 | W: bluesmoke.sourceforge.net |
| 2501 | S: Maintained | 2501 | S: Maintained |
| 2502 | F: drivers/edac/i5000_edac.c | 2502 | F: drivers/edac/i5000_edac.c |
| @@ -2525,21 +2525,21 @@ F: drivers/edac/i7core_edac.c | |||
| 2525 | EDAC-I82975X | 2525 | EDAC-I82975X |
| 2526 | M: Ranganathan Desikan <ravi@jetztechnologies.com> | 2526 | M: Ranganathan Desikan <ravi@jetztechnologies.com> |
| 2527 | M: "Arvind R." <arvino55@gmail.com> | 2527 | M: "Arvind R." <arvino55@gmail.com> |
| 2528 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2528 | L: linux-edac@vger.kernel.org |
| 2529 | W: bluesmoke.sourceforge.net | 2529 | W: bluesmoke.sourceforge.net |
| 2530 | S: Maintained | 2530 | S: Maintained |
| 2531 | F: drivers/edac/i82975x_edac.c | 2531 | F: drivers/edac/i82975x_edac.c |
| 2532 | 2532 | ||
| 2533 | EDAC-PASEMI | 2533 | EDAC-PASEMI |
| 2534 | M: Egor Martovetsky <egor@pasemi.com> | 2534 | M: Egor Martovetsky <egor@pasemi.com> |
| 2535 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2535 | L: linux-edac@vger.kernel.org |
| 2536 | W: bluesmoke.sourceforge.net | 2536 | W: bluesmoke.sourceforge.net |
| 2537 | S: Maintained | 2537 | S: Maintained |
| 2538 | F: drivers/edac/pasemi_edac.c | 2538 | F: drivers/edac/pasemi_edac.c |
| 2539 | 2539 | ||
| 2540 | EDAC-R82600 | 2540 | EDAC-R82600 |
| 2541 | M: Tim Small <tim@buttersideup.com> | 2541 | M: Tim Small <tim@buttersideup.com> |
| 2542 | L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers) | 2542 | L: linux-edac@vger.kernel.org |
| 2543 | W: bluesmoke.sourceforge.net | 2543 | W: bluesmoke.sourceforge.net |
| 2544 | S: Maintained | 2544 | S: Maintained |
| 2545 | F: drivers/edac/r82600_edac.c | 2545 | F: drivers/edac/r82600_edac.c |
| @@ -4309,6 +4309,13 @@ W: http://www.kernel.org/doc/man-pages | |||
| 4309 | L: linux-man@vger.kernel.org | 4309 | L: linux-man@vger.kernel.org |
| 4310 | S: Maintained | 4310 | S: Maintained |
| 4311 | 4311 | ||
| 4312 | MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2) | ||
| 4313 | M: Mirko Lindner <mlindner@marvell.com> | ||
| 4314 | M: Stephen Hemminger <shemminger@vyatta.com> | ||
| 4315 | L: netdev@vger.kernel.org | ||
| 4316 | S: Maintained | ||
| 4317 | F: drivers/net/ethernet/marvell/sk* | ||
| 4318 | |||
| 4312 | MARVELL LIBERTAS WIRELESS DRIVER | 4319 | MARVELL LIBERTAS WIRELESS DRIVER |
| 4313 | M: Dan Williams <dcbw@redhat.com> | 4320 | M: Dan Williams <dcbw@redhat.com> |
| 4314 | L: libertas-dev@lists.infradead.org | 4321 | L: libertas-dev@lists.infradead.org |
| @@ -4339,12 +4346,6 @@ M: Nicolas Pitre <nico@fluxnic.net> | |||
| 4339 | S: Odd Fixes | 4346 | S: Odd Fixes |
| 4340 | F: drivers/mmc/host/mvsdio.* | 4347 | F: drivers/mmc/host/mvsdio.* |
| 4341 | 4348 | ||
| 4342 | MARVELL YUKON / SYSKONNECT DRIVER | ||
| 4343 | M: Mirko Lindner <mlindner@syskonnect.de> | ||
| 4344 | M: Ralph Roesler <rroesler@syskonnect.de> | ||
| 4345 | W: http://www.syskonnect.com | ||
| 4346 | S: Supported | ||
| 4347 | |||
| 4348 | MATROX FRAMEBUFFER DRIVER | 4349 | MATROX FRAMEBUFFER DRIVER |
| 4349 | L: linux-fbdev@vger.kernel.org | 4350 | L: linux-fbdev@vger.kernel.org |
| 4350 | S: Orphan | 4351 | S: Orphan |
| @@ -5637,7 +5638,7 @@ M: Ohad Ben-Cohen <ohad@wizery.com> | |||
| 5637 | S: Maintained | 5638 | S: Maintained |
| 5638 | F: drivers/remoteproc/ | 5639 | F: drivers/remoteproc/ |
| 5639 | F: Documentation/remoteproc.txt | 5640 | F: Documentation/remoteproc.txt |
| 5640 | F: include/linux/remoteproc.txt | 5641 | F: include/linux/remoteproc.h |
| 5641 | 5642 | ||
| 5642 | RFKILL | 5643 | RFKILL |
| 5643 | M: Johannes Berg <johannes@sipsolutions.net> | 5644 | M: Johannes Berg <johannes@sipsolutions.net> |
| @@ -6116,12 +6117,6 @@ W: http://www.winischhofer.at/linuxsisusbvga.shtml | |||
| 6116 | S: Maintained | 6117 | S: Maintained |
| 6117 | F: drivers/usb/misc/sisusbvga/ | 6118 | F: drivers/usb/misc/sisusbvga/ |
| 6118 | 6119 | ||
| 6119 | SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS | ||
| 6120 | M: Stephen Hemminger <shemminger@vyatta.com> | ||
| 6121 | L: netdev@vger.kernel.org | ||
| 6122 | S: Maintained | ||
| 6123 | F: drivers/net/ethernet/marvell/sk* | ||
| 6124 | |||
| 6125 | SLAB ALLOCATOR | 6120 | SLAB ALLOCATOR |
| 6126 | M: Christoph Lameter <cl@linux-foundation.org> | 6121 | M: Christoph Lameter <cl@linux-foundation.org> |
| 6127 | M: Pekka Enberg <penberg@kernel.org> | 6122 | M: Pekka Enberg <penberg@kernel.org> |
| @@ -6287,6 +6282,15 @@ F: drivers/tty/serial/sunsu.c | |||
| 6287 | F: drivers/tty/serial/sunzilog.c | 6282 | F: drivers/tty/serial/sunzilog.c |
| 6288 | F: drivers/tty/serial/sunzilog.h | 6283 | F: drivers/tty/serial/sunzilog.h |
| 6289 | 6284 | ||
| 6285 | SPARSE CHECKER | ||
| 6286 | M: "Christopher Li" <sparse@chrisli.org> | ||
| 6287 | L: linux-sparse@vger.kernel.org | ||
| 6288 | W: https://sparse.wiki.kernel.org/ | ||
| 6289 | T: git git://git.kernel.org/pub/scm/devel/sparse/sparse.git | ||
| 6290 | T: git git://git.kernel.org/pub/scm/devel/sparse/chrisl/sparse.git | ||
| 6291 | S: Maintained | ||
| 6292 | F: include/linux/compiler.h | ||
| 6293 | |||
| 6290 | SPEAR PLATFORM SUPPORT | 6294 | SPEAR PLATFORM SUPPORT |
| 6291 | M: Viresh Kumar <viresh.kumar@st.com> | 6295 | M: Viresh Kumar <viresh.kumar@st.com> |
| 6292 | L: spear-devel@list.st.com | 6296 | L: spear-devel@list.st.com |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 6f7feb5db271..35f2ef44de12 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -120,12 +120,13 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, | |||
| 120 | */ | 120 | */ |
| 121 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) | 121 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) |
| 122 | { | 122 | { |
| 123 | mask &= _BLOCKABLE; | 123 | sigset_t blocked; |
| 124 | spin_lock_irq(¤t->sighand->siglock); | 124 | |
| 125 | current->saved_sigmask = current->blocked; | 125 | current->saved_sigmask = current->blocked; |
| 126 | siginitset(¤t->blocked, mask); | 126 | |
| 127 | recalc_sigpending(); | 127 | mask &= _BLOCKABLE; |
| 128 | spin_unlock_irq(¤t->sighand->siglock); | 128 | siginitset(&blocked, mask); |
| 129 | set_current_blocked(&blocked); | ||
| 129 | 130 | ||
| 130 | current->state = TASK_INTERRUPTIBLE; | 131 | current->state = TASK_INTERRUPTIBLE; |
| 131 | schedule(); | 132 | schedule(); |
| @@ -238,10 +239,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, | |||
| 238 | goto give_sigsegv; | 239 | goto give_sigsegv; |
| 239 | 240 | ||
| 240 | sigdelsetmask(&set, ~_BLOCKABLE); | 241 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 241 | spin_lock_irq(¤t->sighand->siglock); | 242 | set_current_blocked(&set); |
| 242 | current->blocked = set; | ||
| 243 | recalc_sigpending(); | ||
| 244 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 245 | 243 | ||
| 246 | if (restore_sigcontext(sc, regs, sw)) | 244 | if (restore_sigcontext(sc, regs, sw)) |
| 247 | goto give_sigsegv; | 245 | goto give_sigsegv; |
| @@ -276,10 +274,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, | |||
| 276 | goto give_sigsegv; | 274 | goto give_sigsegv; |
| 277 | 275 | ||
| 278 | sigdelsetmask(&set, ~_BLOCKABLE); | 276 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 279 | spin_lock_irq(¤t->sighand->siglock); | 277 | set_current_blocked(&set); |
| 280 | current->blocked = set; | ||
| 281 | recalc_sigpending(); | ||
| 282 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 283 | 278 | ||
| 284 | if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) | 279 | if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) |
| 285 | goto give_sigsegv; | 280 | goto give_sigsegv; |
| @@ -501,14 +496,8 @@ handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 501 | else | 496 | else |
| 502 | ret = setup_frame(sig, ka, oldset, regs, sw); | 497 | ret = setup_frame(sig, ka, oldset, regs, sw); |
| 503 | 498 | ||
| 504 | if (ret == 0) { | 499 | if (ret == 0) |
| 505 | spin_lock_irq(¤t->sighand->siglock); | 500 | block_sigmask(ka, sig); |
| 506 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
| 507 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
| 508 | sigaddset(¤t->blocked,sig); | ||
| 509 | recalc_sigpending(); | ||
| 510 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 511 | } | ||
| 512 | 501 | ||
| 513 | return ret; | 502 | return ret; |
| 514 | } | 503 | } |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 93180845ae16..cf006d40342c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -338,6 +338,7 @@ config ARCH_AT91 | |||
| 338 | select HAVE_CLK | 338 | select HAVE_CLK |
| 339 | select CLKDEV_LOOKUP | 339 | select CLKDEV_LOOKUP |
| 340 | select IRQ_DOMAIN | 340 | select IRQ_DOMAIN |
| 341 | select NEED_MACH_IO_H if PCCARD | ||
| 341 | help | 342 | help |
| 342 | This enables support for systems based on the Atmel AT91RM9200, | 343 | This enables support for systems based on the Atmel AT91RM9200, |
| 343 | AT91SAM9 processors. | 344 | AT91SAM9 processors. |
diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi index 92f36627e7f8..799ad1889b51 100644 --- a/arch/arm/boot/dts/at91sam9g20.dtsi +++ b/arch/arm/boot/dts/at91sam9g20.dtsi | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | }; | 35 | }; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | memory@20000000 { | 38 | memory { |
| 39 | reg = <0x20000000 0x08000000>; | 39 | reg = <0x20000000 0x08000000>; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index ac0dc0031dda..7829a4d0cb22 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
| @@ -37,8 +37,8 @@ | |||
| 37 | usb0: ohci@00600000 { | 37 | usb0: ohci@00600000 { |
| 38 | status = "okay"; | 38 | status = "okay"; |
| 39 | num-ports = <2>; | 39 | num-ports = <2>; |
| 40 | atmel,vbus-gpio = <&pioD 19 0 | 40 | atmel,vbus-gpio = <&pioD 19 1 |
| 41 | &pioD 20 0 | 41 | &pioD 20 1 |
| 42 | >; | 42 | >; |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 3d0c32fb218f..9e6eb6ecea0e 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -36,7 +36,7 @@ | |||
| 36 | }; | 36 | }; |
| 37 | }; | 37 | }; |
| 38 | 38 | ||
| 39 | memory@70000000 { | 39 | memory { |
| 40 | reg = <0x70000000 0x10000000>; | 40 | reg = <0x70000000 0x10000000>; |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index c4c8ae4123d5..a3633bd13111 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; | 17 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"; |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
| 20 | memory@70000000 { | 20 | memory { |
| 21 | reg = <0x70000000 0x4000000>; | 21 | reg = <0x70000000 0x4000000>; |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| @@ -73,8 +73,8 @@ | |||
| 73 | usb0: ohci@00700000 { | 73 | usb0: ohci@00700000 { |
| 74 | status = "okay"; | 74 | status = "okay"; |
| 75 | num-ports = <2>; | 75 | num-ports = <2>; |
| 76 | atmel,vbus-gpio = <&pioD 1 0 | 76 | atmel,vbus-gpio = <&pioD 1 1 |
| 77 | &pioD 3 0>; | 77 | &pioD 3 1>; |
| 78 | }; | 78 | }; |
| 79 | 79 | ||
| 80 | usb1: ehci@00800000 { | 80 | usb1: ehci@00800000 { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index c111001f254e..70ab3a4e026f 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | }; | 34 | }; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | memory@20000000 { | 37 | memory { |
| 38 | reg = <0x20000000 0x10000000>; | 38 | reg = <0x20000000 0x10000000>; |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| @@ -201,8 +201,8 @@ | |||
| 201 | >; | 201 | >; |
| 202 | atmel,nand-addr-offset = <21>; | 202 | atmel,nand-addr-offset = <21>; |
| 203 | atmel,nand-cmd-offset = <22>; | 203 | atmel,nand-cmd-offset = <22>; |
| 204 | gpios = <&pioC 8 0 | 204 | gpios = <&pioD 5 0 |
| 205 | &pioC 14 0 | 205 | &pioD 4 0 |
| 206 | 0 | 206 | 0 |
| 207 | >; | 207 | >; |
| 208 | status = "disabled"; | 208 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/at91sam9x5cm.dtsi b/arch/arm/boot/dts/at91sam9x5cm.dtsi index 67936f83c694..31e7be23703d 100644 --- a/arch/arm/boot/dts/at91sam9x5cm.dtsi +++ b/arch/arm/boot/dts/at91sam9x5cm.dtsi | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | / { | 10 | / { |
| 11 | memory@20000000 { | 11 | memory { |
| 12 | reg = <0x20000000 0x8000000>; | 12 | reg = <0x20000000 0x8000000>; |
| 13 | }; | 13 | }; |
| 14 | 14 | ||
diff --git a/arch/arm/boot/dts/usb_a9g20.dts b/arch/arm/boot/dts/usb_a9g20.dts index 3b3c4e0fa79f..7c2399c532e5 100644 --- a/arch/arm/boot/dts/usb_a9g20.dts +++ b/arch/arm/boot/dts/usb_a9g20.dts | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs"; | 16 | bootargs = "mem=64M console=ttyS0,115200 root=/dev/mtdblock5 rw rootfstype=ubifs"; |
| 17 | }; | 17 | }; |
| 18 | 18 | ||
| 19 | memory@20000000 { | 19 | memory { |
| 20 | reg = <0x20000000 0x4000000>; | 20 | reg = <0x20000000 0x4000000>; |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 44f4a09ff37b..05112380dc53 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define __ASM_BARRIER_H | 2 | #define __ASM_BARRIER_H |
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
| 5 | #include <asm/outercache.h> | ||
| 5 | 6 | ||
| 6 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | 7 | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); |
| 7 | 8 | ||
| @@ -39,7 +40,6 @@ | |||
| 39 | #ifdef CONFIG_ARCH_HAS_BARRIERS | 40 | #ifdef CONFIG_ARCH_HAS_BARRIERS |
| 40 | #include <mach/barriers.h> | 41 | #include <mach/barriers.h> |
| 41 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) | 42 | #elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) |
| 42 | #include <asm/outercache.h> | ||
| 43 | #define mb() do { dsb(); outer_sync(); } while (0) | 43 | #define mb() do { dsb(); outer_sync(); } while (0) |
| 44 | #define rmb() dsb() | 44 | #define rmb() dsb() |
| 45 | #define wmb() mb() | 45 | #define wmb() mb() |
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index df0ac0bb39aa..9af5563dd3eb 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h | |||
| @@ -119,7 +119,7 @@ static inline void __iomem *__typesafe_io(unsigned long addr) | |||
| 119 | #ifdef CONFIG_NEED_MACH_IO_H | 119 | #ifdef CONFIG_NEED_MACH_IO_H |
| 120 | #include <mach/io.h> | 120 | #include <mach/io.h> |
| 121 | #else | 121 | #else |
| 122 | #define __io(a) ({ (void)(a); __typesafe_io(0); }) | 122 | #define __io(a) __typesafe_io((a) & IO_SPACE_LIMIT) |
| 123 | #endif | 123 | #endif |
| 124 | 124 | ||
| 125 | /* | 125 | /* |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 7e5651ee9f85..5652dde4bbe2 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -598,6 +598,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
| 598 | else | 598 | else |
| 599 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 599 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
| 600 | 600 | ||
| 601 | if (!gpio_is_valid(cs_pin)) | ||
| 602 | continue; | ||
| 603 | |||
| 601 | if (devices[i].bus_num == 0) | 604 | if (devices[i].bus_num == 0) |
| 602 | enable_spi0 = 1; | 605 | enable_spi0 = 1; |
| 603 | else | 606 | else |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 096da87dc00d..4db961a93085 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
| @@ -415,6 +415,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
| 415 | else | 415 | else |
| 416 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 416 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
| 417 | 417 | ||
| 418 | if (!gpio_is_valid(cs_pin)) | ||
| 419 | continue; | ||
| 420 | |||
| 418 | if (devices[i].bus_num == 0) | 421 | if (devices[i].bus_num == 0) |
| 419 | enable_spi0 = 1; | 422 | enable_spi0 = 1; |
| 420 | else | 423 | else |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 53688c46f956..fe99206de880 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -72,7 +72,8 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) | |||
| 72 | /* Enable VBus control for UHP ports */ | 72 | /* Enable VBus control for UHP ports */ |
| 73 | for (i = 0; i < data->ports; i++) { | 73 | for (i = 0; i < data->ports; i++) { |
| 74 | if (gpio_is_valid(data->vbus_pin[i])) | 74 | if (gpio_is_valid(data->vbus_pin[i])) |
| 75 | at91_set_gpio_output(data->vbus_pin[i], 0); | 75 | at91_set_gpio_output(data->vbus_pin[i], |
| 76 | data->vbus_pin_active_low[i]); | ||
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | /* Enable overcurrent notification */ | 79 | /* Enable overcurrent notification */ |
| @@ -671,6 +672,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
| 671 | else | 672 | else |
| 672 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 673 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
| 673 | 674 | ||
| 675 | if (!gpio_is_valid(cs_pin)) | ||
| 676 | continue; | ||
| 677 | |||
| 674 | if (devices[i].bus_num == 0) | 678 | if (devices[i].bus_num == 0) |
| 675 | enable_spi0 = 1; | 679 | enable_spi0 = 1; |
| 676 | else | 680 | else |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 698479f1e197..6b008aee1dff 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -127,12 +127,13 @@ void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data) | |||
| 127 | /* Enable VBus control for UHP ports */ | 127 | /* Enable VBus control for UHP ports */ |
| 128 | for (i = 0; i < data->ports; i++) { | 128 | for (i = 0; i < data->ports; i++) { |
| 129 | if (gpio_is_valid(data->vbus_pin[i])) | 129 | if (gpio_is_valid(data->vbus_pin[i])) |
| 130 | at91_set_gpio_output(data->vbus_pin[i], 0); | 130 | at91_set_gpio_output(data->vbus_pin[i], |
| 131 | data->vbus_pin_active_low[i]); | ||
| 131 | } | 132 | } |
| 132 | 133 | ||
| 133 | /* Enable overcurrent notification */ | 134 | /* Enable overcurrent notification */ |
| 134 | for (i = 0; i < data->ports; i++) { | 135 | for (i = 0; i < data->ports; i++) { |
| 135 | if (data->overcurrent_pin[i]) | 136 | if (gpio_is_valid(data->overcurrent_pin[i])) |
| 136 | at91_set_gpio_input(data->overcurrent_pin[i], 1); | 137 | at91_set_gpio_input(data->overcurrent_pin[i], 1); |
| 137 | } | 138 | } |
| 138 | 139 | ||
| @@ -188,7 +189,8 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) | |||
| 188 | /* Enable VBus control for UHP ports */ | 189 | /* Enable VBus control for UHP ports */ |
| 189 | for (i = 0; i < data->ports; i++) { | 190 | for (i = 0; i < data->ports; i++) { |
| 190 | if (gpio_is_valid(data->vbus_pin[i])) | 191 | if (gpio_is_valid(data->vbus_pin[i])) |
| 191 | at91_set_gpio_output(data->vbus_pin[i], 0); | 192 | at91_set_gpio_output(data->vbus_pin[i], |
| 193 | data->vbus_pin_active_low[i]); | ||
| 192 | } | 194 | } |
| 193 | 195 | ||
| 194 | usbh_ehci_data = *data; | 196 | usbh_ehci_data = *data; |
| @@ -785,6 +787,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
| 785 | else | 787 | else |
| 786 | cs_pin = spi1_standard_cs[devices[i].chip_select]; | 788 | cs_pin = spi1_standard_cs[devices[i].chip_select]; |
| 787 | 789 | ||
| 790 | if (!gpio_is_valid(cs_pin)) | ||
| 791 | continue; | ||
| 792 | |||
| 788 | if (devices[i].bus_num == 0) | 793 | if (devices[i].bus_num == 0) |
| 789 | enable_spi0 = 1; | 794 | enable_spi0 = 1; |
| 790 | else | 795 | else |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index eda72e83037d..fe4ae22e8561 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
| @@ -419,6 +419,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
| 419 | else | 419 | else |
| 420 | cs_pin = spi_standard_cs[devices[i].chip_select]; | 420 | cs_pin = spi_standard_cs[devices[i].chip_select]; |
| 421 | 421 | ||
| 422 | if (!gpio_is_valid(cs_pin)) | ||
| 423 | continue; | ||
| 424 | |||
| 422 | /* enable chip-select pin */ | 425 | /* enable chip-select pin */ |
| 423 | at91_set_gpio_output(cs_pin, 1); | 426 | at91_set_gpio_output(cs_pin, 1); |
| 424 | 427 | ||
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index b6831eeb7b76..13c8cae60462 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
| @@ -223,6 +223,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 223 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), | 223 | CLKDEV_CON_DEV_ID("usart", "f8028000.serial", &usart3_clk), |
| 224 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), | 224 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb0_clk), |
| 225 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), | 225 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), |
| 226 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), | ||
| 227 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), | ||
| 226 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 228 | CLKDEV_CON_ID("pioA", &pioAB_clk), |
| 227 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 229 | CLKDEV_CON_ID("pioB", &pioAB_clk), |
| 228 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 230 | CLKDEV_CON_ID("pioC", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 66f0ddf4b2ae..2ffe50f3a9e9 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
| @@ -74,6 +74,7 @@ static void __init ek_init_early(void) | |||
| 74 | static struct at91_usbh_data __initdata ek_usbh_data = { | 74 | static struct at91_usbh_data __initdata ek_usbh_data = { |
| 75 | .ports = 2, | 75 | .ports = 2, |
| 76 | .vbus_pin = { AT91_PIN_PA24, AT91_PIN_PA21 }, | 76 | .vbus_pin = { AT91_PIN_PA24, AT91_PIN_PA21 }, |
| 77 | .vbus_pin_active_low = {1, 1}, | ||
| 77 | .overcurrent_pin= {-EINVAL, -EINVAL}, | 78 | .overcurrent_pin= {-EINVAL, -EINVAL}, |
| 78 | }; | 79 | }; |
| 79 | 80 | ||
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index e1bea73e6b30..c88e908ddd82 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c | |||
| @@ -71,6 +71,7 @@ static void __init ek_init_early(void) | |||
| 71 | static struct at91_usbh_data __initdata ek_usbh_hs_data = { | 71 | static struct at91_usbh_data __initdata ek_usbh_hs_data = { |
| 72 | .ports = 2, | 72 | .ports = 2, |
| 73 | .vbus_pin = {AT91_PIN_PD1, AT91_PIN_PD3}, | 73 | .vbus_pin = {AT91_PIN_PD1, AT91_PIN_PD3}, |
| 74 | .vbus_pin_active_low = {1, 1}, | ||
| 74 | .overcurrent_pin= {-EINVAL, -EINVAL}, | 75 | .overcurrent_pin= {-EINVAL, -EINVAL}, |
| 75 | }; | 76 | }; |
| 76 | 77 | ||
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 544a5d5ce416..49a821192c65 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
| @@ -86,14 +86,15 @@ extern void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *d | |||
| 86 | extern void __init at91_add_device_eth(struct macb_platform_data *data); | 86 | extern void __init at91_add_device_eth(struct macb_platform_data *data); |
| 87 | 87 | ||
| 88 | /* USB Host */ | 88 | /* USB Host */ |
| 89 | #define AT91_MAX_USBH_PORTS 3 | ||
| 89 | struct at91_usbh_data { | 90 | struct at91_usbh_data { |
| 90 | u8 ports; /* number of ports on root hub */ | 91 | int vbus_pin[AT91_MAX_USBH_PORTS]; /* port power-control pin */ |
| 91 | int vbus_pin[2]; /* port power-control pin */ | 92 | int overcurrent_pin[AT91_MAX_USBH_PORTS]; |
| 92 | u8 vbus_pin_active_low[2]; | 93 | u8 ports; /* number of ports on root hub */ |
| 93 | u8 overcurrent_supported; | 94 | u8 overcurrent_supported; |
| 94 | int overcurrent_pin[2]; | 95 | u8 vbus_pin_active_low[AT91_MAX_USBH_PORTS]; |
| 95 | u8 overcurrent_status[2]; | 96 | u8 overcurrent_status[AT91_MAX_USBH_PORTS]; |
| 96 | u8 overcurrent_changed[2]; | 97 | u8 overcurrent_changed[AT91_MAX_USBH_PORTS]; |
| 97 | }; | 98 | }; |
| 98 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); | 99 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); |
| 99 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); | 100 | extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data); |
diff --git a/arch/arm/mach-at91/include/mach/io.h b/arch/arm/mach-at91/include/mach/io.h new file mode 100644 index 000000000000..2d9ca0455745 --- /dev/null +++ b/arch/arm/mach-at91/include/mach/io.h | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-at91/include/mach/io.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2003 SAN People | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef __ASM_ARCH_IO_H | ||
| 22 | #define __ASM_ARCH_IO_H | ||
| 23 | |||
| 24 | #define IO_SPACE_LIMIT 0xFFFFFFFF | ||
| 25 | #define __io(a) __typesafe_io(a) | ||
| 26 | |||
| 27 | #endif | ||
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index e6cc50e94a58..8614aab47cc0 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
| @@ -583,10 +583,11 @@ core_initcall(exynos_core_init); | |||
| 583 | #ifdef CONFIG_CACHE_L2X0 | 583 | #ifdef CONFIG_CACHE_L2X0 |
| 584 | static int __init exynos4_l2x0_cache_init(void) | 584 | static int __init exynos4_l2x0_cache_init(void) |
| 585 | { | 585 | { |
| 586 | int ret; | ||
| 587 | |||
| 586 | if (soc_is_exynos5250()) | 588 | if (soc_is_exynos5250()) |
| 587 | return 0; | 589 | return 0; |
| 588 | 590 | ||
| 589 | int ret; | ||
| 590 | ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); | 591 | ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK); |
| 591 | if (!ret) { | 592 | if (!ret) { |
| 592 | l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs); | 593 | l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs); |
diff --git a/arch/arm/mach-exynos/dma.c b/arch/arm/mach-exynos/dma.c index 3983abee4264..69aaa4503205 100644 --- a/arch/arm/mach-exynos/dma.c +++ b/arch/arm/mach-exynos/dma.c | |||
| @@ -35,8 +35,6 @@ | |||
| 35 | #include <mach/irqs.h> | 35 | #include <mach/irqs.h> |
| 36 | #include <mach/dma.h> | 36 | #include <mach/dma.h> |
| 37 | 37 | ||
| 38 | static u64 dma_dmamask = DMA_BIT_MASK(32); | ||
| 39 | |||
| 40 | static u8 exynos4210_pdma0_peri[] = { | 38 | static u8 exynos4210_pdma0_peri[] = { |
| 41 | DMACH_PCM0_RX, | 39 | DMACH_PCM0_RX, |
| 42 | DMACH_PCM0_TX, | 40 | DMACH_PCM0_TX, |
diff --git a/arch/arm/mach-exynos/include/mach/debug-macro.S b/arch/arm/mach-exynos/include/mach/debug-macro.S index 6c857ff0b5d8..e0c86ea475e7 100644 --- a/arch/arm/mach-exynos/include/mach/debug-macro.S +++ b/arch/arm/mach-exynos/include/mach/debug-macro.S | |||
| @@ -21,10 +21,9 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | .macro addruart, rp, rv, tmp | 23 | .macro addruart, rp, rv, tmp |
| 24 | mov \rp, #0x10000000 | 24 | mrc p15, 0, \tmp, c0, c0, 0 |
| 25 | ldr \rp, [\rp, #0x0] | 25 | and \tmp, \tmp, #0xf0 |
| 26 | and \rp, \rp, #0xf00000 | 26 | teq \tmp, #0xf0 @@ A15 |
| 27 | teq \rp, #0x500000 @@ EXYNOS5 | ||
| 28 | ldreq \rp, =EXYNOS5_PA_UART | 27 | ldreq \rp, =EXYNOS5_PA_UART |
| 29 | movne \rp, #EXYNOS4_PA_UART @@ EXYNOS4 | 28 | movne \rp, #EXYNOS4_PA_UART @@ EXYNOS4 |
| 30 | ldr \rv, =S3C_VA_UART | 29 | ldr \rv, =S3C_VA_UART |
diff --git a/arch/arm/mach-exynos/include/mach/uncompress.h b/arch/arm/mach-exynos/include/mach/uncompress.h index 493f4f365ddf..2979995d5a6a 100644 --- a/arch/arm/mach-exynos/include/mach/uncompress.h +++ b/arch/arm/mach-exynos/include/mach/uncompress.h | |||
| @@ -20,9 +20,24 @@ volatile u8 *uart_base; | |||
| 20 | 20 | ||
| 21 | #include <plat/uncompress.h> | 21 | #include <plat/uncompress.h> |
| 22 | 22 | ||
| 23 | static unsigned int __raw_readl(unsigned int ptr) | ||
| 24 | { | ||
| 25 | return *((volatile unsigned int *)ptr); | ||
| 26 | } | ||
| 27 | |||
| 23 | static void arch_detect_cpu(void) | 28 | static void arch_detect_cpu(void) |
| 24 | { | 29 | { |
| 25 | if (machine_is_smdk5250()) | 30 | u32 chip_id = __raw_readl(EXYNOS_PA_CHIPID); |
| 31 | |||
| 32 | /* | ||
| 33 | * product_id is bits 31:12 | ||
| 34 | * bits 23:20 describe the exynosX family | ||
| 35 | * | ||
| 36 | */ | ||
| 37 | chip_id >>= 20; | ||
| 38 | chip_id &= 0xf; | ||
| 39 | |||
| 40 | if (chip_id == 0x5) | ||
| 26 | uart_base = (volatile u8 *)EXYNOS5_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); | 41 | uart_base = (volatile u8 *)EXYNOS5_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); |
| 27 | else | 42 | else |
| 28 | uart_base = (volatile u8 *)EXYNOS4_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); | 43 | uart_base = (volatile u8 *)EXYNOS4_PA_UART + (S3C_UART_OFFSET * CONFIG_S3C_LOWLEVEL_UART_PORT); |
diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-imx27.c index b9a95ed75553..98e04f5a87dd 100644 --- a/arch/arm/mach-imx/clock-imx27.c +++ b/arch/arm/mach-imx/clock-imx27.c | |||
| @@ -662,6 +662,7 @@ static struct clk_lookup lookups[] = { | |||
| 662 | _REGISTER_CLOCK(NULL, "dma", dma_clk) | 662 | _REGISTER_CLOCK(NULL, "dma", dma_clk) |
| 663 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) | 663 | _REGISTER_CLOCK(NULL, "rtic", rtic_clk) |
| 664 | _REGISTER_CLOCK(NULL, "brom", brom_clk) | 664 | _REGISTER_CLOCK(NULL, "brom", brom_clk) |
| 665 | _REGISTER_CLOCK(NULL, "emma", emma_clk) | ||
| 665 | _REGISTER_CLOCK("m2m-emmaprp.0", NULL, emma_clk) | 666 | _REGISTER_CLOCK("m2m-emmaprp.0", NULL, emma_clk) |
| 666 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk) | 667 | _REGISTER_CLOCK(NULL, "slcdc", slcdc_clk) |
| 667 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) | 668 | _REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk) |
diff --git a/arch/arm/mach-imx/clock-imx35.c b/arch/arm/mach-imx/clock-imx35.c index 1e279af656ad..e56c1a83eee3 100644 --- a/arch/arm/mach-imx/clock-imx35.c +++ b/arch/arm/mach-imx/clock-imx35.c | |||
| @@ -483,7 +483,7 @@ static struct clk_lookup lookups[] = { | |||
| 483 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) | 483 | _REGISTER_CLOCK("imx2-wdt.0", NULL, wdog_clk) |
| 484 | _REGISTER_CLOCK(NULL, "max", max_clk) | 484 | _REGISTER_CLOCK(NULL, "max", max_clk) |
| 485 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) | 485 | _REGISTER_CLOCK(NULL, "audmux", audmux_clk) |
| 486 | _REGISTER_CLOCK(NULL, "csi", csi_clk) | 486 | _REGISTER_CLOCK("mx3-camera.0", NULL, csi_clk) |
| 487 | _REGISTER_CLOCK(NULL, "iim", iim_clk) | 487 | _REGISTER_CLOCK(NULL, "iim", iim_clk) |
| 488 | _REGISTER_CLOCK(NULL, "gpu2d", gpu2d_clk) | 488 | _REGISTER_CLOCK(NULL, "gpu2d", gpu2d_clk) |
| 489 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) | 489 | _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) |
diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index 27bc27e6ea41..c650145d1646 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | #include <linux/usb/otg.h> | 38 | #include <linux/usb/otg.h> |
| 39 | #include <linux/usb/ulpi.h> | 39 | #include <linux/usb/ulpi.h> |
| 40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
| 41 | #include <linux/regulator/machine.h> | ||
| 42 | #include <linux/regulator/fixed.h> | ||
| 41 | 43 | ||
| 42 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
| 43 | #include <asm/mach-types.h> | 45 | #include <asm/mach-types.h> |
| @@ -479,6 +481,11 @@ static struct platform_device *devices[] __initdata = { | |||
| 479 | &armadillo5x0_smc911x_device, | 481 | &armadillo5x0_smc911x_device, |
| 480 | }; | 482 | }; |
| 481 | 483 | ||
| 484 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 485 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
| 486 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
| 487 | }; | ||
| 488 | |||
| 482 | /* | 489 | /* |
| 483 | * Perform board specific initializations | 490 | * Perform board specific initializations |
| 484 | */ | 491 | */ |
| @@ -489,6 +496,8 @@ static void __init armadillo5x0_init(void) | |||
| 489 | mxc_iomux_setup_multiple_pins(armadillo5x0_pins, | 496 | mxc_iomux_setup_multiple_pins(armadillo5x0_pins, |
| 490 | ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); | 497 | ARRAY_SIZE(armadillo5x0_pins), "armadillo5x0"); |
| 491 | 498 | ||
| 499 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 500 | |||
| 492 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 501 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 493 | imx_add_gpio_keys(&armadillo5x0_button_data); | 502 | imx_add_gpio_keys(&armadillo5x0_button_data); |
| 494 | imx31_add_imx_i2c1(NULL); | 503 | imx31_add_imx_i2c1(NULL); |
diff --git a/arch/arm/mach-imx/mach-kzm_arm11_01.c b/arch/arm/mach-imx/mach-kzm_arm11_01.c index fc78e8071cd1..15a26e908260 100644 --- a/arch/arm/mach-imx/mach-kzm_arm11_01.c +++ b/arch/arm/mach-imx/mach-kzm_arm11_01.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/serial_8250.h> | 24 | #include <linux/serial_8250.h> |
| 25 | #include <linux/smsc911x.h> | 25 | #include <linux/smsc911x.h> |
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 27 | #include <linux/regulator/machine.h> | ||
| 28 | #include <linux/regulator/fixed.h> | ||
| 27 | 29 | ||
| 28 | #include <asm/irq.h> | 30 | #include <asm/irq.h> |
| 29 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
| @@ -166,6 +168,11 @@ static struct platform_device kzm_smsc9118_device = { | |||
| 166 | }, | 168 | }, |
| 167 | }; | 169 | }; |
| 168 | 170 | ||
| 171 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 172 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
| 173 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
| 174 | }; | ||
| 175 | |||
| 169 | static int __init kzm_init_smsc9118(void) | 176 | static int __init kzm_init_smsc9118(void) |
| 170 | { | 177 | { |
| 171 | /* | 178 | /* |
| @@ -175,6 +182,8 @@ static int __init kzm_init_smsc9118(void) | |||
| 175 | gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2), "smsc9118-int"); | 182 | gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2), "smsc9118-int"); |
| 176 | gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); | 183 | gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_2)); |
| 177 | 184 | ||
| 185 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 186 | |||
| 178 | return platform_device_register(&kzm_smsc9118_device); | 187 | return platform_device_register(&kzm_smsc9118_device); |
| 179 | } | 188 | } |
| 180 | #else | 189 | #else |
diff --git a/arch/arm/mach-imx/mach-mx31lilly.c b/arch/arm/mach-imx/mach-mx31lilly.c index 02401bbd6d53..83714b0cc290 100644 --- a/arch/arm/mach-imx/mach-mx31lilly.c +++ b/arch/arm/mach-imx/mach-mx31lilly.c | |||
| @@ -34,6 +34,8 @@ | |||
| 34 | #include <linux/mfd/mc13783.h> | 34 | #include <linux/mfd/mc13783.h> |
| 35 | #include <linux/usb/otg.h> | 35 | #include <linux/usb/otg.h> |
| 36 | #include <linux/usb/ulpi.h> | 36 | #include <linux/usb/ulpi.h> |
| 37 | #include <linux/regulator/machine.h> | ||
| 38 | #include <linux/regulator/fixed.h> | ||
| 37 | 39 | ||
| 38 | #include <asm/mach-types.h> | 40 | #include <asm/mach-types.h> |
| 39 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
| @@ -242,6 +244,11 @@ static struct platform_device *devices[] __initdata = { | |||
| 242 | static int mx31lilly_baseboard; | 244 | static int mx31lilly_baseboard; |
| 243 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); | 245 | core_param(mx31lilly_baseboard, mx31lilly_baseboard, int, 0444); |
| 244 | 246 | ||
| 247 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 248 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
| 249 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
| 250 | }; | ||
| 251 | |||
| 245 | static void __init mx31lilly_board_init(void) | 252 | static void __init mx31lilly_board_init(void) |
| 246 | { | 253 | { |
| 247 | imx31_soc_init(); | 254 | imx31_soc_init(); |
| @@ -280,6 +287,8 @@ static void __init mx31lilly_board_init(void) | |||
| 280 | imx31_add_spi_imx1(&spi1_pdata); | 287 | imx31_add_spi_imx1(&spi1_pdata); |
| 281 | spi_register_board_info(&mc13783_dev, 1); | 288 | spi_register_board_info(&mc13783_dev, 1); |
| 282 | 289 | ||
| 290 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 291 | |||
| 283 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 292 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 284 | 293 | ||
| 285 | /* USB */ | 294 | /* USB */ |
diff --git a/arch/arm/mach-imx/mach-mx31lite.c b/arch/arm/mach-imx/mach-mx31lite.c index ef80751712e7..0abef5f13df5 100644 --- a/arch/arm/mach-imx/mach-mx31lite.c +++ b/arch/arm/mach-imx/mach-mx31lite.c | |||
| @@ -29,6 +29,8 @@ | |||
| 29 | #include <linux/usb/ulpi.h> | 29 | #include <linux/usb/ulpi.h> |
| 30 | #include <linux/mtd/physmap.h> | 30 | #include <linux/mtd/physmap.h> |
| 31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
| 32 | #include <linux/regulator/machine.h> | ||
| 33 | #include <linux/regulator/fixed.h> | ||
| 32 | 34 | ||
| 33 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
| 34 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
| @@ -226,6 +228,11 @@ void __init mx31lite_map_io(void) | |||
| 226 | static int mx31lite_baseboard; | 228 | static int mx31lite_baseboard; |
| 227 | core_param(mx31lite_baseboard, mx31lite_baseboard, int, 0444); | 229 | core_param(mx31lite_baseboard, mx31lite_baseboard, int, 0444); |
| 228 | 230 | ||
| 231 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 232 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
| 233 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
| 234 | }; | ||
| 235 | |||
| 229 | static void __init mx31lite_init(void) | 236 | static void __init mx31lite_init(void) |
| 230 | { | 237 | { |
| 231 | int ret; | 238 | int ret; |
| @@ -259,6 +266,8 @@ static void __init mx31lite_init(void) | |||
| 259 | if (usbh2_pdata.otg) | 266 | if (usbh2_pdata.otg) |
| 260 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); | 267 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); |
| 261 | 268 | ||
| 269 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 270 | |||
| 262 | /* SMSC9117 IRQ pin */ | 271 | /* SMSC9117 IRQ pin */ |
| 263 | ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq"); | 272 | ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq"); |
| 264 | if (ret) | 273 | if (ret) |
diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c index e14291d89e4f..6ae51c6b95b7 100644 --- a/arch/arm/mach-imx/mach-mx35_3ds.c +++ b/arch/arm/mach-imx/mach-mx35_3ds.c | |||
| @@ -97,7 +97,7 @@ static struct i2c_board_info __initdata i2c_devices_3ds[] = { | |||
| 97 | static int lcd_power_gpio = -ENXIO; | 97 | static int lcd_power_gpio = -ENXIO; |
| 98 | 98 | ||
| 99 | static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip, | 99 | static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip, |
| 100 | void *data) | 100 | const void *data) |
| 101 | { | 101 | { |
| 102 | return !strcmp(chip->label, data); | 102 | return !strcmp(chip->label, data); |
| 103 | } | 103 | } |
diff --git a/arch/arm/mach-imx/mach-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c index 753f4fc9ec04..05641980dc5e 100644 --- a/arch/arm/mach-imx/mach-mx53_ard.c +++ b/arch/arm/mach-imx/mach-mx53_ard.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/smsc911x.h> | 25 | #include <linux/smsc911x.h> |
| 26 | #include <linux/regulator/machine.h> | ||
| 27 | #include <linux/regulator/fixed.h> | ||
| 26 | 28 | ||
| 27 | #include <mach/common.h> | 29 | #include <mach/common.h> |
| 28 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
| @@ -214,6 +216,11 @@ static int weim_cs_config(void) | |||
| 214 | return 0; | 216 | return 0; |
| 215 | } | 217 | } |
| 216 | 218 | ||
| 219 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 220 | REGULATOR_SUPPLY("vdd33a", "smsc911x"), | ||
| 221 | REGULATOR_SUPPLY("vddvario", "smsc911x"), | ||
| 222 | }; | ||
| 223 | |||
| 217 | void __init imx53_ard_common_init(void) | 224 | void __init imx53_ard_common_init(void) |
| 218 | { | 225 | { |
| 219 | mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, | 226 | mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads, |
| @@ -232,6 +239,7 @@ static void __init mx53_ard_board_init(void) | |||
| 232 | 239 | ||
| 233 | imx53_ard_common_init(); | 240 | imx53_ard_common_init(); |
| 234 | mx53_ard_io_init(); | 241 | mx53_ard_io_init(); |
| 242 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 235 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 243 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 236 | 244 | ||
| 237 | imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); | 245 | imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data); |
diff --git a/arch/arm/mach-msm/smd_debug.c b/arch/arm/mach-msm/smd_debug.c index 0c56a5aaf588..c56df9e932ae 100644 --- a/arch/arm/mach-msm/smd_debug.c +++ b/arch/arm/mach-msm/smd_debug.c | |||
| @@ -203,15 +203,9 @@ static ssize_t debug_read(struct file *file, char __user *buf, | |||
| 203 | return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); | 203 | return simple_read_from_buffer(buf, count, ppos, debug_buffer, bsize); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | static int debug_open(struct inode *inode, struct file *file) | ||
| 207 | { | ||
| 208 | file->private_data = inode->i_private; | ||
| 209 | return 0; | ||
| 210 | } | ||
| 211 | |||
| 212 | static const struct file_operations debug_ops = { | 206 | static const struct file_operations debug_ops = { |
| 213 | .read = debug_read, | 207 | .read = debug_read, |
| 214 | .open = debug_open, | 208 | .open = simple_open, |
| 215 | .llseek = default_llseek, | 209 | .llseek = default_llseek, |
| 216 | }; | 210 | }; |
| 217 | 211 | ||
diff --git a/arch/arm/mach-omap1/include/mach/io.h b/arch/arm/mach-omap1/include/mach/io.h new file mode 100644 index 000000000000..ce4f8005b26f --- /dev/null +++ b/arch/arm/mach-omap1/include/mach/io.h | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-omap1/include/mach/io.h | ||
| 3 | * | ||
| 4 | * IO definitions for TI OMAP processors and boards | ||
| 5 | * | ||
| 6 | * Copied from arch/arm/mach-sa1100/include/mach/io.h | ||
| 7 | * Copyright (C) 1997-1999 Russell King | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify it | ||
| 10 | * under the terms of the GNU General Public License as published by the | ||
| 11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 12 | * option) any later version. | ||
| 13 | * | ||
| 14 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
| 15 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
| 16 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
| 17 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 20 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
| 21 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License along | ||
| 26 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 27 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 28 | * | ||
| 29 | * Modifications: | ||
| 30 | * 06-12-1997 RMK Created. | ||
| 31 | * 07-04-1999 RMK Major cleanup | ||
| 32 | */ | ||
| 33 | |||
| 34 | #ifndef __ASM_ARM_ARCH_IO_H | ||
| 35 | #define __ASM_ARM_ARCH_IO_H | ||
| 36 | |||
| 37 | #define IO_SPACE_LIMIT 0xffffffff | ||
| 38 | |||
| 39 | /* | ||
| 40 | * We don't actually have real ISA nor PCI buses, but there is so many | ||
| 41 | * drivers out there that might just work if we fake them... | ||
| 42 | */ | ||
| 43 | #define __io(a) __typesafe_io(a) | ||
| 44 | |||
| 45 | #endif | ||
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index 41b0a2fe0b04..909a8b91b564 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/i2c/at24.h> | 27 | #include <linux/i2c/at24.h> |
| 28 | #include <linux/i2c/twl.h> | 28 | #include <linux/i2c/twl.h> |
| 29 | #include <linux/regulator/fixed.h> | ||
| 29 | #include <linux/regulator/machine.h> | 30 | #include <linux/regulator/machine.h> |
| 30 | #include <linux/mmc/host.h> | 31 | #include <linux/mmc/host.h> |
| 31 | 32 | ||
| @@ -81,8 +82,23 @@ static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = { | |||
| 81 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, | 82 | .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS, |
| 82 | }; | 83 | }; |
| 83 | 84 | ||
| 85 | static struct regulator_consumer_supply cm_t35_smsc911x_supplies[] = { | ||
| 86 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 87 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 88 | }; | ||
| 89 | |||
| 90 | static struct regulator_consumer_supply sb_t35_smsc911x_supplies[] = { | ||
| 91 | REGULATOR_SUPPLY("vddvario", "smsc911x.1"), | ||
| 92 | REGULATOR_SUPPLY("vdd33a", "smsc911x.1"), | ||
| 93 | }; | ||
| 94 | |||
| 84 | static void __init cm_t35_init_ethernet(void) | 95 | static void __init cm_t35_init_ethernet(void) |
| 85 | { | 96 | { |
| 97 | regulator_register_fixed(0, cm_t35_smsc911x_supplies, | ||
| 98 | ARRAY_SIZE(cm_t35_smsc911x_supplies)); | ||
| 99 | regulator_register_fixed(1, sb_t35_smsc911x_supplies, | ||
| 100 | ARRAY_SIZE(sb_t35_smsc911x_supplies)); | ||
| 101 | |||
| 86 | gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); | 102 | gpmc_smsc911x_init(&cm_t35_smsc911x_cfg); |
| 87 | gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); | 103 | gpmc_smsc911x_init(&sb_t35_smsc911x_cfg); |
| 88 | } | 104 | } |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index e558800adfdf..930c0d380435 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
| @@ -634,8 +634,14 @@ static void __init igep_wlan_bt_init(void) | |||
| 634 | static inline void __init igep_wlan_bt_init(void) { } | 634 | static inline void __init igep_wlan_bt_init(void) { } |
| 635 | #endif | 635 | #endif |
| 636 | 636 | ||
| 637 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 638 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 639 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 640 | }; | ||
| 641 | |||
| 637 | static void __init igep_init(void) | 642 | static void __init igep_init(void) |
| 638 | { | 643 | { |
| 644 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 639 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 645 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 640 | 646 | ||
| 641 | /* Get IGEP2 hardware revision */ | 647 | /* Get IGEP2 hardware revision */ |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index d50a562adfa0..1b6049567ab4 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
| 23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
| 24 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
| 25 | #include <linux/regulator/fixed.h> | ||
| 25 | #include <linux/regulator/machine.h> | 26 | #include <linux/regulator/machine.h> |
| 26 | #include <linux/i2c/twl.h> | 27 | #include <linux/i2c/twl.h> |
| 27 | #include <linux/io.h> | 28 | #include <linux/io.h> |
| @@ -410,8 +411,14 @@ static struct mtd_partition ldp_nand_partitions[] = { | |||
| 410 | 411 | ||
| 411 | }; | 412 | }; |
| 412 | 413 | ||
| 414 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 415 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 416 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 417 | }; | ||
| 418 | |||
| 413 | static void __init omap_ldp_init(void) | 419 | static void __init omap_ldp_init(void) |
| 414 | { | 420 | { |
| 421 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 415 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 422 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 416 | ldp_init_smsc911x(); | 423 | ldp_init_smsc911x(); |
| 417 | omap_i2c_init(); | 424 | omap_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 4c90f078abe1..49df12735b41 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -114,15 +114,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { | |||
| 114 | 114 | ||
| 115 | static inline void __init omap3evm_init_smsc911x(void) | 115 | static inline void __init omap3evm_init_smsc911x(void) |
| 116 | { | 116 | { |
| 117 | struct clk *l3ck; | ||
| 118 | unsigned int rate; | ||
| 119 | |||
| 120 | l3ck = clk_get(NULL, "l3_ck"); | ||
| 121 | if (IS_ERR(l3ck)) | ||
| 122 | rate = 100000000; | ||
| 123 | else | ||
| 124 | rate = clk_get_rate(l3ck); | ||
| 125 | |||
| 126 | /* Configure ethernet controller reset gpio */ | 117 | /* Configure ethernet controller reset gpio */ |
| 127 | if (cpu_is_omap3430()) { | 118 | if (cpu_is_omap3430()) { |
| 128 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) | 119 | if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1) |
| @@ -632,9 +623,15 @@ static void __init omap3_evm_wl12xx_init(void) | |||
| 632 | #endif | 623 | #endif |
| 633 | } | 624 | } |
| 634 | 625 | ||
| 626 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 627 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 628 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 629 | }; | ||
| 630 | |||
| 635 | static void __init omap3_evm_init(void) | 631 | static void __init omap3_evm_init(void) |
| 636 | { | 632 | { |
| 637 | omap3_evm_get_revision(); | 633 | omap3_evm_get_revision(); |
| 634 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 638 | 635 | ||
| 639 | if (cpu_is_omap3630()) | 636 | if (cpu_is_omap3630()) |
| 640 | omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB); | 637 | omap3_mux_init(omap36x_board_mux, OMAP_PACKAGE_CBB); |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 4a7d8c8a75da..9b3c141ff51b 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | 25 | ||
| 26 | #include <linux/regulator/fixed.h> | ||
| 26 | #include <linux/regulator/machine.h> | 27 | #include <linux/regulator/machine.h> |
| 27 | 28 | ||
| 28 | #include <linux/i2c/twl.h> | 29 | #include <linux/i2c/twl.h> |
| @@ -188,8 +189,14 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 188 | }; | 189 | }; |
| 189 | #endif | 190 | #endif |
| 190 | 191 | ||
| 192 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 193 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 194 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 195 | }; | ||
| 196 | |||
| 191 | static void __init omap3logic_init(void) | 197 | static void __init omap3logic_init(void) |
| 192 | { | 198 | { |
| 199 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 193 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 200 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 194 | omap3torpedo_fix_pbias_voltage(); | 201 | omap3torpedo_fix_pbias_voltage(); |
| 195 | omap3logic_i2c_init(); | 202 | omap3logic_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 641004380795..4dffc95bddd2 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/input.h> | 24 | #include <linux/input.h> |
| 25 | #include <linux/gpio_keys.h> | 25 | #include <linux/gpio_keys.h> |
| 26 | 26 | ||
| 27 | #include <linux/regulator/fixed.h> | ||
| 27 | #include <linux/regulator/machine.h> | 28 | #include <linux/regulator/machine.h> |
| 28 | #include <linux/i2c/twl.h> | 29 | #include <linux/i2c/twl.h> |
| 29 | #include <linux/mmc/host.h> | 30 | #include <linux/mmc/host.h> |
| @@ -72,15 +73,6 @@ static struct omap_smsc911x_platform_data smsc911x_cfg = { | |||
| 72 | 73 | ||
| 73 | static inline void __init omap3stalker_init_eth(void) | 74 | static inline void __init omap3stalker_init_eth(void) |
| 74 | { | 75 | { |
| 75 | struct clk *l3ck; | ||
| 76 | unsigned int rate; | ||
| 77 | |||
| 78 | l3ck = clk_get(NULL, "l3_ck"); | ||
| 79 | if (IS_ERR(l3ck)) | ||
| 80 | rate = 100000000; | ||
| 81 | else | ||
| 82 | rate = clk_get_rate(l3ck); | ||
| 83 | |||
| 84 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); | 76 | omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); |
| 85 | gpmc_smsc911x_init(&smsc911x_cfg); | 77 | gpmc_smsc911x_init(&smsc911x_cfg); |
| 86 | } | 78 | } |
| @@ -419,8 +411,14 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
| 419 | }; | 411 | }; |
| 420 | #endif | 412 | #endif |
| 421 | 413 | ||
| 414 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 415 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 416 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 417 | }; | ||
| 418 | |||
| 422 | static void __init omap3_stalker_init(void) | 419 | static void __init omap3_stalker_init(void) |
| 423 | { | 420 | { |
| 421 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 424 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); | 422 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
| 425 | omap_board_config = omap3_stalker_config; | 423 | omap_board_config = omap3_stalker_config; |
| 426 | omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); | 424 | omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 668533e2a379..33aa3910b09e 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
| @@ -498,10 +498,18 @@ static struct gpio overo_bt_gpios[] __initdata = { | |||
| 498 | { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, | 498 | { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" }, |
| 499 | }; | 499 | }; |
| 500 | 500 | ||
| 501 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 502 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 503 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 504 | REGULATOR_SUPPLY("vddvario", "smsc911x.1"), | ||
| 505 | REGULATOR_SUPPLY("vdd33a", "smsc911x.1"), | ||
| 506 | }; | ||
| 507 | |||
| 501 | static void __init overo_init(void) | 508 | static void __init overo_init(void) |
| 502 | { | 509 | { |
| 503 | int ret; | 510 | int ret; |
| 504 | 511 | ||
| 512 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 505 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 513 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 506 | omap_hsmmc_init(mmc); | 514 | omap_hsmmc_init(mmc); |
| 507 | overo_i2c_init(); | 515 | overo_i2c_init(); |
diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c index 1e8540eabde9..f64f44173061 100644 --- a/arch/arm/mach-omap2/board-zoom-debugboard.c +++ b/arch/arm/mach-omap2/board-zoom-debugboard.c | |||
| @@ -14,6 +14,9 @@ | |||
| 14 | #include <linux/smsc911x.h> | 14 | #include <linux/smsc911x.h> |
| 15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
| 16 | 16 | ||
| 17 | #include <linux/regulator/fixed.h> | ||
| 18 | #include <linux/regulator/machine.h> | ||
| 19 | |||
| 17 | #include <plat/gpmc.h> | 20 | #include <plat/gpmc.h> |
| 18 | #include <plat/gpmc-smsc911x.h> | 21 | #include <plat/gpmc-smsc911x.h> |
| 19 | 22 | ||
| @@ -117,11 +120,17 @@ static struct platform_device *zoom_devices[] __initdata = { | |||
| 117 | &zoom_debugboard_serial_device, | 120 | &zoom_debugboard_serial_device, |
| 118 | }; | 121 | }; |
| 119 | 122 | ||
| 123 | static struct regulator_consumer_supply dummy_supplies[] = { | ||
| 124 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 125 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 126 | }; | ||
| 127 | |||
| 120 | int __init zoom_debugboard_init(void) | 128 | int __init zoom_debugboard_init(void) |
| 121 | { | 129 | { |
| 122 | if (!omap_zoom_debugboard_detect()) | 130 | if (!omap_zoom_debugboard_detect()) |
| 123 | return 0; | 131 | return 0; |
| 124 | 132 | ||
| 133 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); | ||
| 125 | zoom_init_smsc911x(); | 134 | zoom_init_smsc911x(); |
| 126 | zoom_init_quaduart(); | 135 | zoom_init_quaduart(); |
| 127 | return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); | 136 | return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices)); |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 480fb8f09aed..f4a626f7c79e 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
| @@ -747,7 +747,7 @@ static struct clk dpll4_m3_ck = { | |||
| 747 | .parent = &dpll4_ck, | 747 | .parent = &dpll4_ck, |
| 748 | .init = &omap2_init_clksel_parent, | 748 | .init = &omap2_init_clksel_parent, |
| 749 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 749 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
| 750 | .clksel_mask = OMAP3430_CLKSEL_TV_MASK, | 750 | .clksel_mask = OMAP3630_CLKSEL_TV_MASK, |
| 751 | .clksel = dpll4_clksel, | 751 | .clksel = dpll4_clksel, |
| 752 | .clkdm_name = "dpll4_clkdm", | 752 | .clkdm_name = "dpll4_clkdm", |
| 753 | .recalc = &omap2_clksel_recalc, | 753 | .recalc = &omap2_clksel_recalc, |
| @@ -832,7 +832,7 @@ static struct clk dpll4_m4_ck = { | |||
| 832 | .parent = &dpll4_ck, | 832 | .parent = &dpll4_ck, |
| 833 | .init = &omap2_init_clksel_parent, | 833 | .init = &omap2_init_clksel_parent, |
| 834 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), | 834 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL), |
| 835 | .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, | 835 | .clksel_mask = OMAP3630_CLKSEL_DSS1_MASK, |
| 836 | .clksel = dpll4_clksel, | 836 | .clksel = dpll4_clksel, |
| 837 | .clkdm_name = "dpll4_clkdm", | 837 | .clkdm_name = "dpll4_clkdm", |
| 838 | .recalc = &omap2_clksel_recalc, | 838 | .recalc = &omap2_clksel_recalc, |
| @@ -859,7 +859,7 @@ static struct clk dpll4_m5_ck = { | |||
| 859 | .parent = &dpll4_ck, | 859 | .parent = &dpll4_ck, |
| 860 | .init = &omap2_init_clksel_parent, | 860 | .init = &omap2_init_clksel_parent, |
| 861 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), | 861 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL), |
| 862 | .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, | 862 | .clksel_mask = OMAP3630_CLKSEL_CAM_MASK, |
| 863 | .clksel = dpll4_clksel, | 863 | .clksel = dpll4_clksel, |
| 864 | .clkdm_name = "dpll4_clkdm", | 864 | .clkdm_name = "dpll4_clkdm", |
| 865 | .set_rate = &omap2_clksel_set_rate, | 865 | .set_rate = &omap2_clksel_set_rate, |
| @@ -886,7 +886,7 @@ static struct clk dpll4_m6_ck = { | |||
| 886 | .parent = &dpll4_ck, | 886 | .parent = &dpll4_ck, |
| 887 | .init = &omap2_init_clksel_parent, | 887 | .init = &omap2_init_clksel_parent, |
| 888 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), | 888 | .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1), |
| 889 | .clksel_mask = OMAP3430_DIV_DPLL4_MASK, | 889 | .clksel_mask = OMAP3630_DIV_DPLL4_MASK, |
| 890 | .clksel = dpll4_clksel, | 890 | .clksel = dpll4_clksel, |
| 891 | .clkdm_name = "dpll4_clkdm", | 891 | .clkdm_name = "dpll4_clkdm", |
| 892 | .recalc = &omap2_clksel_recalc, | 892 | .recalc = &omap2_clksel_recalc, |
| @@ -1394,6 +1394,7 @@ static struct clk cpefuse_fck = { | |||
| 1394 | .name = "cpefuse_fck", | 1394 | .name = "cpefuse_fck", |
| 1395 | .ops = &clkops_omap2_dflt, | 1395 | .ops = &clkops_omap2_dflt, |
| 1396 | .parent = &sys_ck, | 1396 | .parent = &sys_ck, |
| 1397 | .clkdm_name = "core_l4_clkdm", | ||
| 1397 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1398 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
| 1398 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, | 1399 | .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT, |
| 1399 | .recalc = &followparent_recalc, | 1400 | .recalc = &followparent_recalc, |
| @@ -1403,6 +1404,7 @@ static struct clk ts_fck = { | |||
| 1403 | .name = "ts_fck", | 1404 | .name = "ts_fck", |
| 1404 | .ops = &clkops_omap2_dflt, | 1405 | .ops = &clkops_omap2_dflt, |
| 1405 | .parent = &omap_32k_fck, | 1406 | .parent = &omap_32k_fck, |
| 1407 | .clkdm_name = "core_l4_clkdm", | ||
| 1406 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1408 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
| 1407 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, | 1409 | .enable_bit = OMAP3430ES2_EN_TS_SHIFT, |
| 1408 | .recalc = &followparent_recalc, | 1410 | .recalc = &followparent_recalc, |
| @@ -1412,6 +1414,7 @@ static struct clk usbtll_fck = { | |||
| 1412 | .name = "usbtll_fck", | 1414 | .name = "usbtll_fck", |
| 1413 | .ops = &clkops_omap2_dflt_wait, | 1415 | .ops = &clkops_omap2_dflt_wait, |
| 1414 | .parent = &dpll5_m2_ck, | 1416 | .parent = &dpll5_m2_ck, |
| 1417 | .clkdm_name = "core_l4_clkdm", | ||
| 1415 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), | 1418 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3), |
| 1416 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, | 1419 | .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT, |
| 1417 | .recalc = &followparent_recalc, | 1420 | .recalc = &followparent_recalc, |
| @@ -1617,6 +1620,7 @@ static struct clk fshostusb_fck = { | |||
| 1617 | .name = "fshostusb_fck", | 1620 | .name = "fshostusb_fck", |
| 1618 | .ops = &clkops_omap2_dflt_wait, | 1621 | .ops = &clkops_omap2_dflt_wait, |
| 1619 | .parent = &core_48m_fck, | 1622 | .parent = &core_48m_fck, |
| 1623 | .clkdm_name = "core_l4_clkdm", | ||
| 1620 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), | 1624 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), |
| 1621 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, | 1625 | .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT, |
| 1622 | .recalc = &followparent_recalc, | 1626 | .recalc = &followparent_recalc, |
| @@ -2043,6 +2047,7 @@ static struct clk omapctrl_ick = { | |||
| 2043 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), | 2047 | .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), |
| 2044 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, | 2048 | .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT, |
| 2045 | .flags = ENABLE_ON_INIT, | 2049 | .flags = ENABLE_ON_INIT, |
| 2050 | .clkdm_name = "core_l4_clkdm", | ||
| 2046 | .recalc = &followparent_recalc, | 2051 | .recalc = &followparent_recalc, |
| 2047 | }; | 2052 | }; |
| 2048 | 2053 | ||
| @@ -2094,6 +2099,7 @@ static struct clk usb_l4_ick = { | |||
| 2094 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), | 2099 | .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL), |
| 2095 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, | 2100 | .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK, |
| 2096 | .clksel = usb_l4_clksel, | 2101 | .clksel = usb_l4_clksel, |
| 2102 | .clkdm_name = "core_l4_clkdm", | ||
| 2097 | .recalc = &omap2_clksel_recalc, | 2103 | .recalc = &omap2_clksel_recalc, |
| 2098 | }; | 2104 | }; |
| 2099 | 2105 | ||
| @@ -3467,8 +3473,8 @@ static struct omap_clk omap3xxx_clks[] = { | |||
| 3467 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), | 3473 | CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX), |
| 3468 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), | 3474 | CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX), |
| 3469 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), | 3475 | CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX), |
| 3470 | CLK("davinci_emac", "emac_clk", &emac_ick, CK_AM35XX), | 3476 | CLK("davinci_emac", NULL, &emac_ick, CK_AM35XX), |
| 3471 | CLK("davinci_emac", "phy_clk", &emac_fck, CK_AM35XX), | 3477 | CLK("davinci_mdio.0", NULL, &emac_fck, CK_AM35XX), |
| 3472 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), | 3478 | CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX), |
| 3473 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), | 3479 | CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX), |
| 3474 | CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), | 3480 | CLK("musb-am35x", "ick", &hsotgusb_ick_am35xx, CK_AM35XX), |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index c03c1108468e..fa6ea65ad44b 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -957,8 +957,8 @@ static struct dpll_data dpll_usb_dd = { | |||
| 957 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), | 957 | .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED), |
| 958 | .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB, | 958 | .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB, |
| 959 | .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB, | 959 | .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB, |
| 960 | .mult_mask = OMAP4430_DPLL_MULT_MASK, | 960 | .mult_mask = OMAP4430_DPLL_MULT_USB_MASK, |
| 961 | .div1_mask = OMAP4430_DPLL_DIV_MASK, | 961 | .div1_mask = OMAP4430_DPLL_DIV_0_7_MASK, |
| 962 | .enable_mask = OMAP4430_DPLL_EN_MASK, | 962 | .enable_mask = OMAP4430_DPLL_EN_MASK, |
| 963 | .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK, | 963 | .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK, |
| 964 | .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK, | 964 | .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK, |
| @@ -978,6 +978,7 @@ static struct clk dpll_usb_ck = { | |||
| 978 | .recalc = &omap3_dpll_recalc, | 978 | .recalc = &omap3_dpll_recalc, |
| 979 | .round_rate = &omap2_dpll_round_rate, | 979 | .round_rate = &omap2_dpll_round_rate, |
| 980 | .set_rate = &omap3_noncore_dpll_set_rate, | 980 | .set_rate = &omap3_noncore_dpll_set_rate, |
| 981 | .clkdm_name = "l3_init_clkdm", | ||
| 981 | }; | 982 | }; |
| 982 | 983 | ||
| 983 | static struct clk dpll_usb_clkdcoldo_ck = { | 984 | static struct clk dpll_usb_clkdcoldo_ck = { |
diff --git a/arch/arm/mach-omap2/clockdomains44xx_data.c b/arch/arm/mach-omap2/clockdomains44xx_data.c index 9299ac291d28..bd7ed13515cc 100644 --- a/arch/arm/mach-omap2/clockdomains44xx_data.c +++ b/arch/arm/mach-omap2/clockdomains44xx_data.c | |||
| @@ -390,7 +390,7 @@ static struct clockdomain emu_sys_44xx_clkdm = { | |||
| 390 | .prcm_partition = OMAP4430_PRM_PARTITION, | 390 | .prcm_partition = OMAP4430_PRM_PARTITION, |
| 391 | .cm_inst = OMAP4430_PRM_EMU_CM_INST, | 391 | .cm_inst = OMAP4430_PRM_EMU_CM_INST, |
| 392 | .clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS, | 392 | .clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS, |
| 393 | .flags = CLKDM_CAN_HWSUP, | 393 | .flags = CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_FORCE_WAKEUP, |
| 394 | }; | 394 | }; |
| 395 | 395 | ||
| 396 | static struct clockdomain l3_dma_44xx_clkdm = { | 396 | static struct clockdomain l3_dma_44xx_clkdm = { |
diff --git a/arch/arm/mach-omap2/gpmc-smsc911x.c b/arch/arm/mach-omap2/gpmc-smsc911x.c index 5e5880d6d099..b6c77be3e8f7 100644 --- a/arch/arm/mach-omap2/gpmc-smsc911x.c +++ b/arch/arm/mach-omap2/gpmc-smsc911x.c | |||
| @@ -19,15 +19,11 @@ | |||
| 19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
| 20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
| 21 | #include <linux/smsc911x.h> | 21 | #include <linux/smsc911x.h> |
| 22 | #include <linux/regulator/fixed.h> | ||
| 23 | #include <linux/regulator/machine.h> | ||
| 24 | 22 | ||
| 25 | #include <plat/board.h> | 23 | #include <plat/board.h> |
| 26 | #include <plat/gpmc.h> | 24 | #include <plat/gpmc.h> |
| 27 | #include <plat/gpmc-smsc911x.h> | 25 | #include <plat/gpmc-smsc911x.h> |
| 28 | 26 | ||
| 29 | static struct omap_smsc911x_platform_data *gpmc_cfg; | ||
| 30 | |||
| 31 | static struct resource gpmc_smsc911x_resources[] = { | 27 | static struct resource gpmc_smsc911x_resources[] = { |
| 32 | [0] = { | 28 | [0] = { |
| 33 | .flags = IORESOURCE_MEM, | 29 | .flags = IORESOURCE_MEM, |
| @@ -41,51 +37,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { | |||
| 41 | .phy_interface = PHY_INTERFACE_MODE_MII, | 37 | .phy_interface = PHY_INTERFACE_MODE_MII, |
| 42 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | 38 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, |
| 43 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | 39 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, |
| 44 | .flags = SMSC911X_USE_16BIT, | ||
| 45 | }; | ||
| 46 | |||
| 47 | static struct regulator_consumer_supply gpmc_smsc911x_supply[] = { | ||
| 48 | REGULATOR_SUPPLY("vddvario", "smsc911x.0"), | ||
| 49 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* Generic regulator definition to satisfy smsc911x */ | ||
| 53 | static struct regulator_init_data gpmc_smsc911x_reg_init_data = { | ||
| 54 | .constraints = { | ||
| 55 | .min_uV = 3300000, | ||
| 56 | .max_uV = 3300000, | ||
| 57 | .valid_modes_mask = REGULATOR_MODE_NORMAL | ||
| 58 | | REGULATOR_MODE_STANDBY, | ||
| 59 | .valid_ops_mask = REGULATOR_CHANGE_MODE | ||
| 60 | | REGULATOR_CHANGE_STATUS, | ||
| 61 | }, | ||
| 62 | .num_consumer_supplies = ARRAY_SIZE(gpmc_smsc911x_supply), | ||
| 63 | .consumer_supplies = gpmc_smsc911x_supply, | ||
| 64 | }; | ||
| 65 | |||
| 66 | static struct fixed_voltage_config gpmc_smsc911x_fixed_reg_data = { | ||
| 67 | .supply_name = "gpmc_smsc911x", | ||
| 68 | .microvolts = 3300000, | ||
| 69 | .gpio = -EINVAL, | ||
| 70 | .startup_delay = 0, | ||
| 71 | .enable_high = 0, | ||
| 72 | .enabled_at_boot = 1, | ||
| 73 | .init_data = &gpmc_smsc911x_reg_init_data, | ||
| 74 | }; | ||
| 75 | |||
| 76 | /* | ||
| 77 | * Platform device id of 42 is a temporary fix to avoid conflicts | ||
| 78 | * with other reg-fixed-voltage devices. The real fix should | ||
| 79 | * involve the driver core providing a way of dynamically | ||
| 80 | * assigning a unique id on registration for platform devices | ||
| 81 | * in the same name space. | ||
| 82 | */ | ||
| 83 | static struct platform_device gpmc_smsc911x_regulator = { | ||
| 84 | .name = "reg-fixed-voltage", | ||
| 85 | .id = 42, | ||
| 86 | .dev = { | ||
| 87 | .platform_data = &gpmc_smsc911x_fixed_reg_data, | ||
| 88 | }, | ||
| 89 | }; | 40 | }; |
| 90 | 41 | ||
| 91 | /* | 42 | /* |
| @@ -93,23 +44,12 @@ static struct platform_device gpmc_smsc911x_regulator = { | |||
| 93 | * assume that pin multiplexing is done in the board-*.c file, | 44 | * assume that pin multiplexing is done in the board-*.c file, |
| 94 | * or in the bootloader. | 45 | * or in the bootloader. |
| 95 | */ | 46 | */ |
| 96 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | 47 | void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *gpmc_cfg) |
| 97 | { | 48 | { |
| 98 | struct platform_device *pdev; | 49 | struct platform_device *pdev; |
| 99 | unsigned long cs_mem_base; | 50 | unsigned long cs_mem_base; |
| 100 | int ret; | 51 | int ret; |
| 101 | 52 | ||
| 102 | gpmc_cfg = board_data; | ||
| 103 | |||
| 104 | if (!gpmc_cfg->id) { | ||
| 105 | ret = platform_device_register(&gpmc_smsc911x_regulator); | ||
| 106 | if (ret < 0) { | ||
| 107 | pr_err("Unable to register smsc911x regulators: %d\n", | ||
| 108 | ret); | ||
| 109 | return; | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { | 53 | if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { |
| 114 | pr_err("Failed to request GPMC mem region\n"); | 54 | pr_err("Failed to request GPMC mem region\n"); |
| 115 | return; | 55 | return; |
| @@ -139,8 +79,7 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) | |||
| 139 | gpio_set_value(gpmc_cfg->gpio_reset, 1); | 79 | gpio_set_value(gpmc_cfg->gpio_reset, 1); |
| 140 | } | 80 | } |
| 141 | 81 | ||
| 142 | if (gpmc_cfg->flags) | 82 | gpmc_smsc911x_config.flags = gpmc_cfg->flags ? : SMSC911X_USE_16BIT; |
| 143 | gpmc_smsc911x_config.flags = gpmc_cfg->flags; | ||
| 144 | 83 | ||
| 145 | pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, | 84 | pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id, |
| 146 | gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), | 85 | gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources), |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 100db6217f39..b0268eaffe13 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
| @@ -506,6 +506,13 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo, | |||
| 506 | if (oh->dev_attr != NULL) { | 506 | if (oh->dev_attr != NULL) { |
| 507 | mmc_dev_attr = oh->dev_attr; | 507 | mmc_dev_attr = oh->dev_attr; |
| 508 | mmc_data->controller_flags = mmc_dev_attr->flags; | 508 | mmc_data->controller_flags = mmc_dev_attr->flags; |
| 509 | /* | ||
| 510 | * erratum 2.1.1.128 doesn't apply if board has | ||
| 511 | * a transceiver is attached | ||
| 512 | */ | ||
| 513 | if (hsmmcinfo->transceiver) | ||
| 514 | mmc_data->controller_flags &= | ||
| 515 | ~OMAP_HSMMC_BROKEN_MULTIBLOCK_READ; | ||
| 509 | } | 516 | } |
| 510 | 517 | ||
| 511 | pdev = platform_device_alloc(name, ctrl_nr - 1); | 518 | pdev = platform_device_alloc(name, ctrl_nr - 1); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index eba6cd3816f5..2c27fdb61e66 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1395,7 +1395,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name) | |||
| 1395 | */ | 1395 | */ |
| 1396 | static int _ocp_softreset(struct omap_hwmod *oh) | 1396 | static int _ocp_softreset(struct omap_hwmod *oh) |
| 1397 | { | 1397 | { |
| 1398 | u32 v; | 1398 | u32 v, softrst_mask; |
| 1399 | int c = 0; | 1399 | int c = 0; |
| 1400 | int ret = 0; | 1400 | int ret = 0; |
| 1401 | 1401 | ||
| @@ -1427,11 +1427,13 @@ static int _ocp_softreset(struct omap_hwmod *oh) | |||
| 1427 | oh->class->sysc->syss_offs) | 1427 | oh->class->sysc->syss_offs) |
| 1428 | & SYSS_RESETDONE_MASK), | 1428 | & SYSS_RESETDONE_MASK), |
| 1429 | MAX_MODULE_SOFTRESET_WAIT, c); | 1429 | MAX_MODULE_SOFTRESET_WAIT, c); |
| 1430 | else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) | 1430 | else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS) { |
| 1431 | softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); | ||
| 1431 | omap_test_timeout(!(omap_hwmod_read(oh, | 1432 | omap_test_timeout(!(omap_hwmod_read(oh, |
| 1432 | oh->class->sysc->sysc_offs) | 1433 | oh->class->sysc->sysc_offs) |
| 1433 | & SYSC_TYPE2_SOFTRESET_MASK), | 1434 | & softrst_mask), |
| 1434 | MAX_MODULE_SOFTRESET_WAIT, c); | 1435 | MAX_MODULE_SOFTRESET_WAIT, c); |
| 1436 | } | ||
| 1435 | 1437 | ||
| 1436 | if (c == MAX_MODULE_SOFTRESET_WAIT) | 1438 | if (c == MAX_MODULE_SOFTRESET_WAIT) |
| 1437 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", | 1439 | pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n", |
| @@ -1477,6 +1479,11 @@ static int _reset(struct omap_hwmod *oh) | |||
| 1477 | 1479 | ||
| 1478 | ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); | 1480 | ret = (oh->class->reset) ? oh->class->reset(oh) : _ocp_softreset(oh); |
| 1479 | 1481 | ||
| 1482 | if (oh->class->sysc) { | ||
| 1483 | _update_sysc_cache(oh); | ||
| 1484 | _enable_sysc(oh); | ||
| 1485 | } | ||
| 1486 | |||
| 1480 | return ret; | 1487 | return ret; |
| 1481 | } | 1488 | } |
| 1482 | 1489 | ||
| @@ -1786,20 +1793,9 @@ static int _setup(struct omap_hwmod *oh, void *data) | |||
| 1786 | return 0; | 1793 | return 0; |
| 1787 | } | 1794 | } |
| 1788 | 1795 | ||
| 1789 | if (!(oh->flags & HWMOD_INIT_NO_RESET)) { | 1796 | if (!(oh->flags & HWMOD_INIT_NO_RESET)) |
| 1790 | _reset(oh); | 1797 | _reset(oh); |
| 1791 | 1798 | ||
| 1792 | /* | ||
| 1793 | * OCP_SYSCONFIG bits need to be reprogrammed after a softreset. | ||
| 1794 | * The _enable() function should be split to | ||
| 1795 | * avoid the rewrite of the OCP_SYSCONFIG register. | ||
| 1796 | */ | ||
| 1797 | if (oh->class->sysc) { | ||
| 1798 | _update_sysc_cache(oh); | ||
| 1799 | _enable_sysc(oh); | ||
| 1800 | } | ||
| 1801 | } | ||
| 1802 | |||
| 1803 | postsetup_state = oh->_postsetup_state; | 1799 | postsetup_state = oh->_postsetup_state; |
| 1804 | if (postsetup_state == _HWMOD_STATE_UNKNOWN) | 1800 | if (postsetup_state == _HWMOD_STATE_UNKNOWN) |
| 1805 | postsetup_state = _HWMOD_STATE_ENABLED; | 1801 | postsetup_state = _HWMOD_STATE_ENABLED; |
| @@ -1907,20 +1903,10 @@ void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs) | |||
| 1907 | */ | 1903 | */ |
| 1908 | int omap_hwmod_softreset(struct omap_hwmod *oh) | 1904 | int omap_hwmod_softreset(struct omap_hwmod *oh) |
| 1909 | { | 1905 | { |
| 1910 | u32 v; | 1906 | if (!oh) |
| 1911 | int ret; | ||
| 1912 | |||
| 1913 | if (!oh || !(oh->_sysc_cache)) | ||
| 1914 | return -EINVAL; | 1907 | return -EINVAL; |
| 1915 | 1908 | ||
| 1916 | v = oh->_sysc_cache; | 1909 | return _ocp_softreset(oh); |
| 1917 | ret = _set_softreset(oh, &v); | ||
| 1918 | if (ret) | ||
| 1919 | goto error; | ||
| 1920 | _write_sysconfig(v, oh); | ||
| 1921 | |||
| 1922 | error: | ||
| 1923 | return ret; | ||
| 1924 | } | 1910 | } |
| 1925 | 1911 | ||
| 1926 | /** | 1912 | /** |
| @@ -2463,26 +2449,28 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh, | |||
| 2463 | * @oh: struct omap_hwmod * | 2449 | * @oh: struct omap_hwmod * |
| 2464 | * | 2450 | * |
| 2465 | * Sets the module OCP socket ENAWAKEUP bit to allow the module to | 2451 | * Sets the module OCP socket ENAWAKEUP bit to allow the module to |
| 2466 | * send wakeups to the PRCM. Eventually this should sets PRCM wakeup | 2452 | * send wakeups to the PRCM, and enable I/O ring wakeup events for |
| 2467 | * registers to cause the PRCM to receive wakeup events from the | 2453 | * this IP block if it has dynamic mux entries. Eventually this |
| 2468 | * module. Does not set any wakeup routing registers beyond this | 2454 | * should set PRCM wakeup registers to cause the PRCM to receive |
| 2469 | * point - if the module is to wake up any other module or subsystem, | 2455 | * wakeup events from the module. Does not set any wakeup routing |
| 2470 | * that must be set separately. Called by omap_device code. Returns | 2456 | * registers beyond this point - if the module is to wake up any other |
| 2471 | * -EINVAL on error or 0 upon success. | 2457 | * module or subsystem, that must be set separately. Called by |
| 2458 | * omap_device code. Returns -EINVAL on error or 0 upon success. | ||
| 2472 | */ | 2459 | */ |
| 2473 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) | 2460 | int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) |
| 2474 | { | 2461 | { |
| 2475 | unsigned long flags; | 2462 | unsigned long flags; |
| 2476 | u32 v; | 2463 | u32 v; |
| 2477 | 2464 | ||
| 2478 | if (!oh->class->sysc || | ||
| 2479 | !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) | ||
| 2480 | return -EINVAL; | ||
| 2481 | |||
| 2482 | spin_lock_irqsave(&oh->_lock, flags); | 2465 | spin_lock_irqsave(&oh->_lock, flags); |
| 2483 | v = oh->_sysc_cache; | 2466 | |
| 2484 | _enable_wakeup(oh, &v); | 2467 | if (oh->class->sysc && |
| 2485 | _write_sysconfig(v, oh); | 2468 | (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { |
| 2469 | v = oh->_sysc_cache; | ||
| 2470 | _enable_wakeup(oh, &v); | ||
| 2471 | _write_sysconfig(v, oh); | ||
| 2472 | } | ||
| 2473 | |||
| 2486 | _set_idle_ioring_wakeup(oh, true); | 2474 | _set_idle_ioring_wakeup(oh, true); |
| 2487 | spin_unlock_irqrestore(&oh->_lock, flags); | 2475 | spin_unlock_irqrestore(&oh->_lock, flags); |
| 2488 | 2476 | ||
| @@ -2494,26 +2482,28 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) | |||
| 2494 | * @oh: struct omap_hwmod * | 2482 | * @oh: struct omap_hwmod * |
| 2495 | * | 2483 | * |
| 2496 | * Clears the module OCP socket ENAWAKEUP bit to prevent the module | 2484 | * Clears the module OCP socket ENAWAKEUP bit to prevent the module |
| 2497 | * from sending wakeups to the PRCM. Eventually this should clear | 2485 | * from sending wakeups to the PRCM, and disable I/O ring wakeup |
| 2498 | * PRCM wakeup registers to cause the PRCM to ignore wakeup events | 2486 | * events for this IP block if it has dynamic mux entries. Eventually |
| 2499 | * from the module. Does not set any wakeup routing registers beyond | 2487 | * this should clear PRCM wakeup registers to cause the PRCM to ignore |
| 2500 | * this point - if the module is to wake up any other module or | 2488 | * wakeup events from the module. Does not set any wakeup routing |
| 2501 | * subsystem, that must be set separately. Called by omap_device | 2489 | * registers beyond this point - if the module is to wake up any other |
| 2502 | * code. Returns -EINVAL on error or 0 upon success. | 2490 | * module or subsystem, that must be set separately. Called by |
| 2491 | * omap_device code. Returns -EINVAL on error or 0 upon success. | ||
| 2503 | */ | 2492 | */ |
| 2504 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) | 2493 | int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) |
| 2505 | { | 2494 | { |
| 2506 | unsigned long flags; | 2495 | unsigned long flags; |
| 2507 | u32 v; | 2496 | u32 v; |
| 2508 | 2497 | ||
| 2509 | if (!oh->class->sysc || | ||
| 2510 | !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) | ||
| 2511 | return -EINVAL; | ||
| 2512 | |||
| 2513 | spin_lock_irqsave(&oh->_lock, flags); | 2498 | spin_lock_irqsave(&oh->_lock, flags); |
| 2514 | v = oh->_sysc_cache; | 2499 | |
| 2515 | _disable_wakeup(oh, &v); | 2500 | if (oh->class->sysc && |
| 2516 | _write_sysconfig(v, oh); | 2501 | (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)) { |
| 2502 | v = oh->_sysc_cache; | ||
| 2503 | _disable_wakeup(oh, &v); | ||
| 2504 | _write_sysconfig(v, oh); | ||
| 2505 | } | ||
| 2506 | |||
| 2517 | _set_idle_ioring_wakeup(oh, false); | 2507 | _set_idle_ioring_wakeup(oh, false); |
| 2518 | spin_unlock_irqrestore(&oh->_lock, flags); | 2508 | spin_unlock_irqrestore(&oh->_lock, flags); |
| 2519 | 2509 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 08daa5e0eb5f..cc9bd106a854 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -2996,6 +2996,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp1_slaves[] = { | |||
| 2996 | &omap44xx_l4_abe__mcbsp1_dma, | 2996 | &omap44xx_l4_abe__mcbsp1_dma, |
| 2997 | }; | 2997 | }; |
| 2998 | 2998 | ||
| 2999 | static struct omap_hwmod_opt_clk mcbsp1_opt_clks[] = { | ||
| 3000 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
| 3001 | { .role = "prcm_clk", .clk = "mcbsp1_sync_mux_ck" }, | ||
| 3002 | }; | ||
| 3003 | |||
| 2999 | static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | 3004 | static struct omap_hwmod omap44xx_mcbsp1_hwmod = { |
| 3000 | .name = "mcbsp1", | 3005 | .name = "mcbsp1", |
| 3001 | .class = &omap44xx_mcbsp_hwmod_class, | 3006 | .class = &omap44xx_mcbsp_hwmod_class, |
| @@ -3012,6 +3017,8 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | |||
| 3012 | }, | 3017 | }, |
| 3013 | .slaves = omap44xx_mcbsp1_slaves, | 3018 | .slaves = omap44xx_mcbsp1_slaves, |
| 3014 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp1_slaves), | 3019 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp1_slaves), |
| 3020 | .opt_clks = mcbsp1_opt_clks, | ||
| 3021 | .opt_clks_cnt = ARRAY_SIZE(mcbsp1_opt_clks), | ||
| 3015 | }; | 3022 | }; |
| 3016 | 3023 | ||
| 3017 | /* mcbsp2 */ | 3024 | /* mcbsp2 */ |
| @@ -3071,6 +3078,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp2_slaves[] = { | |||
| 3071 | &omap44xx_l4_abe__mcbsp2_dma, | 3078 | &omap44xx_l4_abe__mcbsp2_dma, |
| 3072 | }; | 3079 | }; |
| 3073 | 3080 | ||
| 3081 | static struct omap_hwmod_opt_clk mcbsp2_opt_clks[] = { | ||
| 3082 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
| 3083 | { .role = "prcm_clk", .clk = "mcbsp2_sync_mux_ck" }, | ||
| 3084 | }; | ||
| 3085 | |||
| 3074 | static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | 3086 | static struct omap_hwmod omap44xx_mcbsp2_hwmod = { |
| 3075 | .name = "mcbsp2", | 3087 | .name = "mcbsp2", |
| 3076 | .class = &omap44xx_mcbsp_hwmod_class, | 3088 | .class = &omap44xx_mcbsp_hwmod_class, |
| @@ -3087,6 +3099,8 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | |||
| 3087 | }, | 3099 | }, |
| 3088 | .slaves = omap44xx_mcbsp2_slaves, | 3100 | .slaves = omap44xx_mcbsp2_slaves, |
| 3089 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp2_slaves), | 3101 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp2_slaves), |
| 3102 | .opt_clks = mcbsp2_opt_clks, | ||
| 3103 | .opt_clks_cnt = ARRAY_SIZE(mcbsp2_opt_clks), | ||
| 3090 | }; | 3104 | }; |
| 3091 | 3105 | ||
| 3092 | /* mcbsp3 */ | 3106 | /* mcbsp3 */ |
| @@ -3146,6 +3160,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp3_slaves[] = { | |||
| 3146 | &omap44xx_l4_abe__mcbsp3_dma, | 3160 | &omap44xx_l4_abe__mcbsp3_dma, |
| 3147 | }; | 3161 | }; |
| 3148 | 3162 | ||
| 3163 | static struct omap_hwmod_opt_clk mcbsp3_opt_clks[] = { | ||
| 3164 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
| 3165 | { .role = "prcm_clk", .clk = "mcbsp3_sync_mux_ck" }, | ||
| 3166 | }; | ||
| 3167 | |||
| 3149 | static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | 3168 | static struct omap_hwmod omap44xx_mcbsp3_hwmod = { |
| 3150 | .name = "mcbsp3", | 3169 | .name = "mcbsp3", |
| 3151 | .class = &omap44xx_mcbsp_hwmod_class, | 3170 | .class = &omap44xx_mcbsp_hwmod_class, |
| @@ -3162,6 +3181,8 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | |||
| 3162 | }, | 3181 | }, |
| 3163 | .slaves = omap44xx_mcbsp3_slaves, | 3182 | .slaves = omap44xx_mcbsp3_slaves, |
| 3164 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp3_slaves), | 3183 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp3_slaves), |
| 3184 | .opt_clks = mcbsp3_opt_clks, | ||
| 3185 | .opt_clks_cnt = ARRAY_SIZE(mcbsp3_opt_clks), | ||
| 3165 | }; | 3186 | }; |
| 3166 | 3187 | ||
| 3167 | /* mcbsp4 */ | 3188 | /* mcbsp4 */ |
| @@ -3200,6 +3221,11 @@ static struct omap_hwmod_ocp_if *omap44xx_mcbsp4_slaves[] = { | |||
| 3200 | &omap44xx_l4_per__mcbsp4, | 3221 | &omap44xx_l4_per__mcbsp4, |
| 3201 | }; | 3222 | }; |
| 3202 | 3223 | ||
| 3224 | static struct omap_hwmod_opt_clk mcbsp4_opt_clks[] = { | ||
| 3225 | { .role = "pad_fck", .clk = "pad_clks_ck" }, | ||
| 3226 | { .role = "prcm_clk", .clk = "mcbsp4_sync_mux_ck" }, | ||
| 3227 | }; | ||
| 3228 | |||
| 3203 | static struct omap_hwmod omap44xx_mcbsp4_hwmod = { | 3229 | static struct omap_hwmod omap44xx_mcbsp4_hwmod = { |
| 3204 | .name = "mcbsp4", | 3230 | .name = "mcbsp4", |
| 3205 | .class = &omap44xx_mcbsp_hwmod_class, | 3231 | .class = &omap44xx_mcbsp_hwmod_class, |
| @@ -3216,6 +3242,8 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = { | |||
| 3216 | }, | 3242 | }, |
| 3217 | .slaves = omap44xx_mcbsp4_slaves, | 3243 | .slaves = omap44xx_mcbsp4_slaves, |
| 3218 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp4_slaves), | 3244 | .slaves_cnt = ARRAY_SIZE(omap44xx_mcbsp4_slaves), |
| 3245 | .opt_clks = mcbsp4_opt_clks, | ||
| 3246 | .opt_clks_cnt = ARRAY_SIZE(mcbsp4_opt_clks), | ||
| 3219 | }; | 3247 | }; |
| 3220 | 3248 | ||
| 3221 | /* | 3249 | /* |
diff --git a/arch/arm/mach-omap2/opp.c b/arch/arm/mach-omap2/opp.c index 9262a6b47702..de6d46451746 100644 --- a/arch/arm/mach-omap2/opp.c +++ b/arch/arm/mach-omap2/opp.c | |||
| @@ -64,10 +64,10 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def, | |||
| 64 | } | 64 | } |
| 65 | oh = omap_hwmod_lookup(opp_def->hwmod_name); | 65 | oh = omap_hwmod_lookup(opp_def->hwmod_name); |
| 66 | if (!oh || !oh->od) { | 66 | if (!oh || !oh->od) { |
| 67 | pr_warn("%s: no hwmod or odev for %s, [%d] " | 67 | pr_debug("%s: no hwmod or odev for %s, [%d] " |
| 68 | "cannot add OPPs.\n", __func__, | 68 | "cannot add OPPs.\n", __func__, |
| 69 | opp_def->hwmod_name, i); | 69 | opp_def->hwmod_name, i); |
| 70 | return -EINVAL; | 70 | continue; |
| 71 | } | 71 | } |
| 72 | dev = &oh->od->pdev->dev; | 72 | dev = &oh->od->pdev->dev; |
| 73 | 73 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 238defc6f6df..703bd1099259 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -153,8 +153,7 @@ static void omap3_save_secure_ram_context(void) | |||
| 153 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); | 153 | pwrdm_set_next_pwrst(mpu_pwrdm, mpu_next_state); |
| 154 | /* Following is for error tracking, it should not happen */ | 154 | /* Following is for error tracking, it should not happen */ |
| 155 | if (ret) { | 155 | if (ret) { |
| 156 | printk(KERN_ERR "save_secure_sram() returns %08x\n", | 156 | pr_err("save_secure_sram() returns %08x\n", ret); |
| 157 | ret); | ||
| 158 | while (1) | 157 | while (1) |
| 159 | ; | 158 | ; |
| 160 | } | 159 | } |
| @@ -289,7 +288,7 @@ void omap_sram_idle(void) | |||
| 289 | break; | 288 | break; |
| 290 | default: | 289 | default: |
| 291 | /* Invalid state */ | 290 | /* Invalid state */ |
| 292 | printk(KERN_ERR "Invalid mpu state in sram_idle\n"); | 291 | pr_err("Invalid mpu state in sram_idle\n"); |
| 293 | return; | 292 | return; |
| 294 | } | 293 | } |
| 295 | 294 | ||
| @@ -439,18 +438,17 @@ restore: | |||
| 439 | list_for_each_entry(pwrst, &pwrst_list, node) { | 438 | list_for_each_entry(pwrst, &pwrst_list, node) { |
| 440 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); | 439 | state = pwrdm_read_prev_pwrst(pwrst->pwrdm); |
| 441 | if (state > pwrst->next_state) { | 440 | if (state > pwrst->next_state) { |
| 442 | printk(KERN_INFO "Powerdomain (%s) didn't enter " | 441 | pr_info("Powerdomain (%s) didn't enter " |
| 443 | "target state %d\n", | 442 | "target state %d\n", |
| 444 | pwrst->pwrdm->name, pwrst->next_state); | 443 | pwrst->pwrdm->name, pwrst->next_state); |
| 445 | ret = -1; | 444 | ret = -1; |
| 446 | } | 445 | } |
| 447 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | 446 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); |
| 448 | } | 447 | } |
| 449 | if (ret) | 448 | if (ret) |
| 450 | printk(KERN_ERR "Could not enter target state in pm_suspend\n"); | 449 | pr_err("Could not enter target state in pm_suspend\n"); |
| 451 | else | 450 | else |
| 452 | printk(KERN_INFO "Successfully put all powerdomains " | 451 | pr_info("Successfully put all powerdomains to target state\n"); |
| 453 | "to target state\n"); | ||
| 454 | 452 | ||
| 455 | return ret; | 453 | return ret; |
| 456 | } | 454 | } |
| @@ -734,21 +732,22 @@ static int __init omap3_pm_init(void) | |||
| 734 | 732 | ||
| 735 | if (ret) { | 733 | if (ret) { |
| 736 | pr_err("pm: Failed to request pm_io irq\n"); | 734 | pr_err("pm: Failed to request pm_io irq\n"); |
| 737 | goto err1; | 735 | goto err2; |
| 738 | } | 736 | } |
| 739 | 737 | ||
| 740 | ret = pwrdm_for_each(pwrdms_setup, NULL); | 738 | ret = pwrdm_for_each(pwrdms_setup, NULL); |
| 741 | if (ret) { | 739 | if (ret) { |
| 742 | printk(KERN_ERR "Failed to setup powerdomains\n"); | 740 | pr_err("Failed to setup powerdomains\n"); |
| 743 | goto err2; | 741 | goto err3; |
| 744 | } | 742 | } |
| 745 | 743 | ||
| 746 | (void) clkdm_for_each(omap_pm_clkdms_setup, NULL); | 744 | (void) clkdm_for_each(omap_pm_clkdms_setup, NULL); |
| 747 | 745 | ||
| 748 | mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); | 746 | mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); |
| 749 | if (mpu_pwrdm == NULL) { | 747 | if (mpu_pwrdm == NULL) { |
| 750 | printk(KERN_ERR "Failed to get mpu_pwrdm\n"); | 748 | pr_err("Failed to get mpu_pwrdm\n"); |
| 751 | goto err2; | 749 | ret = -EINVAL; |
| 750 | goto err3; | ||
| 752 | } | 751 | } |
| 753 | 752 | ||
| 754 | neon_pwrdm = pwrdm_lookup("neon_pwrdm"); | 753 | neon_pwrdm = pwrdm_lookup("neon_pwrdm"); |
| @@ -781,8 +780,8 @@ static int __init omap3_pm_init(void) | |||
| 781 | omap3_secure_ram_storage = | 780 | omap3_secure_ram_storage = |
| 782 | kmalloc(0x803F, GFP_KERNEL); | 781 | kmalloc(0x803F, GFP_KERNEL); |
| 783 | if (!omap3_secure_ram_storage) | 782 | if (!omap3_secure_ram_storage) |
| 784 | printk(KERN_ERR "Memory allocation failed when" | 783 | pr_err("Memory allocation failed when " |
| 785 | "allocating for secure sram context\n"); | 784 | "allocating for secure sram context\n"); |
| 786 | 785 | ||
| 787 | local_irq_disable(); | 786 | local_irq_disable(); |
| 788 | local_fiq_disable(); | 787 | local_fiq_disable(); |
| @@ -796,14 +795,17 @@ static int __init omap3_pm_init(void) | |||
| 796 | } | 795 | } |
| 797 | 796 | ||
| 798 | omap3_save_scratchpad_contents(); | 797 | omap3_save_scratchpad_contents(); |
| 799 | err1: | ||
| 800 | return ret; | 798 | return ret; |
| 801 | err2: | 799 | |
| 802 | free_irq(INT_34XX_PRCM_MPU_IRQ, NULL); | 800 | err3: |
| 803 | list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) { | 801 | list_for_each_entry_safe(pwrst, tmp, &pwrst_list, node) { |
| 804 | list_del(&pwrst->node); | 802 | list_del(&pwrst->node); |
| 805 | kfree(pwrst); | 803 | kfree(pwrst); |
| 806 | } | 804 | } |
| 805 | free_irq(omap_prcm_event_to_irq("io"), omap3_pm_init); | ||
| 806 | err2: | ||
| 807 | free_irq(omap_prcm_event_to_irq("wkup"), NULL); | ||
| 808 | err1: | ||
| 807 | return ret; | 809 | return ret; |
| 808 | } | 810 | } |
| 809 | 811 | ||
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 9ccaadc2cf07..885625352429 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
| @@ -144,7 +144,7 @@ static void omap_default_idle(void) | |||
| 144 | static int __init omap4_pm_init(void) | 144 | static int __init omap4_pm_init(void) |
| 145 | { | 145 | { |
| 146 | int ret; | 146 | int ret; |
| 147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm; | 147 | struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup; |
| 148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; | 148 | struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm; |
| 149 | 149 | ||
| 150 | if (!cpu_is_omap44xx()) | 150 | if (!cpu_is_omap44xx()) |
| @@ -168,14 +168,19 @@ static int __init omap4_pm_init(void) | |||
| 168 | * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as | 168 | * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as |
| 169 | * expected. The hardware recommendation is to enable static | 169 | * expected. The hardware recommendation is to enable static |
| 170 | * dependencies for these to avoid system lock ups or random crashes. | 170 | * dependencies for these to avoid system lock ups or random crashes. |
| 171 | * The L4 wakeup depedency is added to workaround the OCP sync hardware | ||
| 172 | * BUG with 32K synctimer which lead to incorrect timer value read | ||
| 173 | * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which | ||
| 174 | * are part of L4 wakeup clockdomain. | ||
| 171 | */ | 175 | */ |
| 172 | mpuss_clkdm = clkdm_lookup("mpuss_clkdm"); | 176 | mpuss_clkdm = clkdm_lookup("mpuss_clkdm"); |
| 173 | emif_clkdm = clkdm_lookup("l3_emif_clkdm"); | 177 | emif_clkdm = clkdm_lookup("l3_emif_clkdm"); |
| 174 | l3_1_clkdm = clkdm_lookup("l3_1_clkdm"); | 178 | l3_1_clkdm = clkdm_lookup("l3_1_clkdm"); |
| 175 | l3_2_clkdm = clkdm_lookup("l3_2_clkdm"); | 179 | l3_2_clkdm = clkdm_lookup("l3_2_clkdm"); |
| 176 | l4_per_clkdm = clkdm_lookup("l4_per_clkdm"); | 180 | l4_per_clkdm = clkdm_lookup("l4_per_clkdm"); |
| 181 | l4wkup = clkdm_lookup("l4_wkup_clkdm"); | ||
| 177 | ducati_clkdm = clkdm_lookup("ducati_clkdm"); | 182 | ducati_clkdm = clkdm_lookup("ducati_clkdm"); |
| 178 | if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || | 183 | if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) || (!l4wkup) || |
| 179 | (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm)) | 184 | (!l3_2_clkdm) || (!ducati_clkdm) || (!l4_per_clkdm)) |
| 180 | goto err2; | 185 | goto err2; |
| 181 | 186 | ||
| @@ -183,6 +188,7 @@ static int __init omap4_pm_init(void) | |||
| 183 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm); | 188 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm); |
| 184 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm); | 189 | ret |= clkdm_add_wkdep(mpuss_clkdm, l3_2_clkdm); |
| 185 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm); | 190 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4_per_clkdm); |
| 191 | ret |= clkdm_add_wkdep(mpuss_clkdm, l4wkup); | ||
| 186 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm); | 192 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm); |
| 187 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm); | 193 | ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm); |
| 188 | if (ret) { | 194 | if (ret) { |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 8a18d1bd61c8..96ad3dbeac34 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
| @@ -972,7 +972,13 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm) | |||
| 972 | 972 | ||
| 973 | int pwrdm_state_switch(struct powerdomain *pwrdm) | 973 | int pwrdm_state_switch(struct powerdomain *pwrdm) |
| 974 | { | 974 | { |
| 975 | return _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | 975 | int ret; |
| 976 | |||
| 977 | ret = pwrdm_wait_transition(pwrdm); | ||
| 978 | if (!ret) | ||
| 979 | ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | ||
| 980 | |||
| 981 | return ret; | ||
| 976 | } | 982 | } |
| 977 | 983 | ||
| 978 | int pwrdm_clkdm_state_switch(struct clockdomain *clkdm) | 984 | int pwrdm_clkdm_state_switch(struct clockdomain *clkdm) |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index eac623c7c3d8..f106d21ff581 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
| @@ -147,8 +147,9 @@ static inline u32 _read_pending_irq_reg(u16 irqen_offs, u16 irqst_offs) | |||
| 147 | u32 mask, st; | 147 | u32 mask, st; |
| 148 | 148 | ||
| 149 | /* XXX read mask from RAM? */ | 149 | /* XXX read mask from RAM? */ |
| 150 | mask = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqen_offs); | 150 | mask = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 151 | st = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, irqst_offs); | 151 | irqen_offs); |
| 152 | st = omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, irqst_offs); | ||
| 152 | 153 | ||
| 153 | return mask & st; | 154 | return mask & st; |
| 154 | } | 155 | } |
| @@ -180,7 +181,7 @@ void omap44xx_prm_read_pending_irqs(unsigned long *events) | |||
| 180 | */ | 181 | */ |
| 181 | void omap44xx_prm_ocp_barrier(void) | 182 | void omap44xx_prm_ocp_barrier(void) |
| 182 | { | 183 | { |
| 183 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 184 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 184 | OMAP4_REVISION_PRM_OFFSET); | 185 | OMAP4_REVISION_PRM_OFFSET); |
| 185 | } | 186 | } |
| 186 | 187 | ||
| @@ -198,19 +199,19 @@ void omap44xx_prm_ocp_barrier(void) | |||
| 198 | void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) | 199 | void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) |
| 199 | { | 200 | { |
| 200 | saved_mask[0] = | 201 | saved_mask[0] = |
| 201 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 202 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 202 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); | 203 | OMAP4_PRM_IRQSTATUS_MPU_OFFSET); |
| 203 | saved_mask[1] = | 204 | saved_mask[1] = |
| 204 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 205 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 205 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); | 206 | OMAP4_PRM_IRQSTATUS_MPU_2_OFFSET); |
| 206 | 207 | ||
| 207 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, | 208 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, |
| 208 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); | 209 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
| 209 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_DEVICE_INST, | 210 | omap4_prm_write_inst_reg(0, OMAP4430_PRM_OCP_SOCKET_INST, |
| 210 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); | 211 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); |
| 211 | 212 | ||
| 212 | /* OCP barrier */ | 213 | /* OCP barrier */ |
| 213 | omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST, | 214 | omap4_prm_read_inst_reg(OMAP4430_PRM_OCP_SOCKET_INST, |
| 214 | OMAP4_REVISION_PRM_OFFSET); | 215 | OMAP4_REVISION_PRM_OFFSET); |
| 215 | } | 216 | } |
| 216 | 217 | ||
| @@ -226,9 +227,9 @@ void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask) | |||
| 226 | */ | 227 | */ |
| 227 | void omap44xx_prm_restore_irqen(u32 *saved_mask) | 228 | void omap44xx_prm_restore_irqen(u32 *saved_mask) |
| 228 | { | 229 | { |
| 229 | omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_DEVICE_INST, | 230 | omap4_prm_write_inst_reg(saved_mask[0], OMAP4430_PRM_OCP_SOCKET_INST, |
| 230 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); | 231 | OMAP4_PRM_IRQENABLE_MPU_OFFSET); |
| 231 | omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_DEVICE_INST, | 232 | omap4_prm_write_inst_reg(saved_mask[1], OMAP4430_PRM_OCP_SOCKET_INST, |
| 232 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); | 233 | OMAP4_PRM_IRQENABLE_MPU_2_OFFSET); |
| 233 | } | 234 | } |
| 234 | 235 | ||
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index 873b51d494ea..d28f848897d6 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
| @@ -290,7 +290,7 @@ int omap_prcm_register_chain_handler(struct omap_prcm_irq_setup *irq_setup) | |||
| 290 | goto err; | 290 | goto err; |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | for (i = 0; i <= irq_setup->nr_regs; i++) { | 293 | for (i = 0; i < irq_setup->nr_regs; i++) { |
| 294 | gc = irq_alloc_generic_chip("PRCM", 1, | 294 | gc = irq_alloc_generic_chip("PRCM", 1, |
| 295 | irq_setup->base_irq + i * 32, prm_base, | 295 | irq_setup->base_irq + i * 32, prm_base, |
| 296 | handle_level_irq); | 296 | handle_level_irq); |
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index f51348dafafd..dde8a11f47d5 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c | |||
| @@ -54,7 +54,7 @@ static struct omap_device_pm_latency omap_uhhtll_latency[] = { | |||
| 54 | /* | 54 | /* |
| 55 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST | 55 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST |
| 56 | */ | 56 | */ |
| 57 | static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 57 | static void __init setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) |
| 58 | { | 58 | { |
| 59 | switch (port_mode[0]) { | 59 | switch (port_mode[0]) { |
| 60 | case OMAP_EHCI_PORT_MODE_PHY: | 60 | case OMAP_EHCI_PORT_MODE_PHY: |
| @@ -197,7 +197,8 @@ static void setup_ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
| 197 | return; | 197 | return; |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 200 | static |
| 201 | void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | ||
| 201 | { | 202 | { |
| 202 | switch (port_mode[0]) { | 203 | switch (port_mode[0]) { |
| 203 | case OMAP_EHCI_PORT_MODE_PHY: | 204 | case OMAP_EHCI_PORT_MODE_PHY: |
| @@ -315,7 +316,7 @@ static void setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
| 315 | } | 316 | } |
| 316 | } | 317 | } |
| 317 | 318 | ||
| 318 | static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 319 | static void __init setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) |
| 319 | { | 320 | { |
| 320 | switch (port_mode[0]) { | 321 | switch (port_mode[0]) { |
| 321 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: | 322 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: |
| @@ -412,7 +413,8 @@ static void setup_ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
| 412 | } | 413 | } |
| 413 | } | 414 | } |
| 414 | 415 | ||
| 415 | static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | 416 | static |
| 417 | void __init setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | ||
| 416 | { | 418 | { |
| 417 | switch (port_mode[0]) { | 419 | switch (port_mode[0]) { |
| 418 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: | 420 | case OMAP_OHCI_PORT_MODE_PHY_6PIN_DATSE0: |
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 109ccd2a8885..fe2d1f80ef50 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
| @@ -113,6 +113,7 @@ config MACH_ARMCORE | |||
| 113 | select IWMMXT | 113 | select IWMMXT |
| 114 | select PXA25x | 114 | select PXA25x |
| 115 | select MIGHT_HAVE_PCI | 115 | select MIGHT_HAVE_PCI |
| 116 | select NEED_MACH_IO_H if PCI | ||
| 116 | 117 | ||
| 117 | config MACH_EM_X270 | 118 | config MACH_EM_X270 |
| 118 | bool "CompuLab EM-x270 platform" | 119 | bool "CompuLab EM-x270 platform" |
diff --git a/arch/arm/mach-pxa/include/mach/io.h b/arch/arm/mach-pxa/include/mach/io.h new file mode 100644 index 000000000000..cd78b7fe3567 --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/io.h | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-pxa/include/mach/io.h | ||
| 3 | * | ||
| 4 | * Copied from asm/arch/sa1100/io.h | ||
| 5 | */ | ||
| 6 | #ifndef __ASM_ARM_ARCH_IO_H | ||
| 7 | #define __ASM_ARM_ARCH_IO_H | ||
| 8 | |||
| 9 | #define IO_SPACE_LIMIT 0xffffffff | ||
| 10 | |||
| 11 | /* | ||
| 12 | * We don't actually have real ISA nor PCI buses, but there is so many | ||
| 13 | * drivers out there that might just work if we fake them... | ||
| 14 | */ | ||
| 15 | #define __io(a) __typesafe_io(a) | ||
| 16 | |||
| 17 | #endif | ||
diff --git a/arch/arm/mach-s3c24xx/common.h b/arch/arm/mach-s3c24xx/common.h new file mode 100644 index 000000000000..c2f596e7bc2d --- /dev/null +++ b/arch/arm/mach-s3c24xx/common.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | ||
| 3 | * http://www.samsung.com | ||
| 4 | * | ||
| 5 | * Common Header for S3C24XX SoCs | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifndef __ARCH_ARM_MACH_S3C24XX_COMMON_H | ||
| 13 | #define __ARCH_ARM_MACH_S3C24XX_COMMON_H __FILE__ | ||
| 14 | |||
| 15 | void s3c2410_restart(char mode, const char *cmd); | ||
| 16 | void s3c244x_restart(char mode, const char *cmd); | ||
| 17 | |||
| 18 | #endif /* __ARCH_ARM_MACH_S3C24XX_COMMON_H */ | ||
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 48885b7efd6b..c7f418b0cde9 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
| @@ -313,6 +313,10 @@ static struct sa1100fb_mach_info collie_lcd_info = { | |||
| 313 | 313 | ||
| 314 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, | 314 | .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, |
| 315 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), | 315 | .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), |
| 316 | |||
| 317 | #ifdef CONFIG_BACKLIGHT_LOCOMO | ||
| 318 | .lcd_power = locomolcd_power | ||
| 319 | #endif | ||
| 316 | }; | 320 | }; |
| 317 | 321 | ||
| 318 | static void __init collie_init(void) | 322 | static void __init collie_init(void) |
diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h index 52acda7061b7..f33679d2d3ee 100644 --- a/arch/arm/mach-sa1100/include/mach/collie.h +++ b/arch/arm/mach-sa1100/include/mach/collie.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/arm/mach-sa1100/include/mach/collie.h | 2 | * arch/arm/mach-sa1100/include/mach/collie.h |
| 3 | * | 3 | * |
| 4 | * This file contains the hardware specific definitions for Assabet | 4 | * This file contains the hardware specific definitions for Collie |
| 5 | * Only include this file from SA1100-specific files. | 5 | * Only include this file from SA1100-specific files. |
| 6 | * | 6 | * |
| 7 | * ChangeLog: | 7 | * ChangeLog: |
| @@ -13,6 +13,7 @@ | |||
| 13 | #ifndef __ASM_ARCH_COLLIE_H | 13 | #ifndef __ASM_ARCH_COLLIE_H |
| 14 | #define __ASM_ARCH_COLLIE_H | 14 | #define __ASM_ARCH_COLLIE_H |
| 15 | 15 | ||
| 16 | extern void locomolcd_power(int on); | ||
| 16 | 17 | ||
| 17 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) | 18 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) |
| 18 | #define COLLIE_GPIO_CHARGE_ON (COLLIE_SCOOP_GPIO_BASE + 0) | 19 | #define COLLIE_GPIO_CHARGE_ON (COLLIE_SCOOP_GPIO_BASE + 0) |
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c index a6e23f464528..d2268be8c34c 100644 --- a/arch/arm/mach-versatile/pci.c +++ b/arch/arm/mach-versatile/pci.c | |||
| @@ -190,7 +190,7 @@ static struct resource pre_mem = { | |||
| 190 | .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH, | 190 | .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH, |
| 191 | }; | 191 | }; |
| 192 | 192 | ||
| 193 | static int __init pci_versatile_setup_resources(struct list_head *resources) | 193 | static int __init pci_versatile_setup_resources(struct pci_sys_data *sys) |
| 194 | { | 194 | { |
| 195 | int ret = 0; | 195 | int ret = 0; |
| 196 | 196 | ||
| @@ -218,9 +218,9 @@ static int __init pci_versatile_setup_resources(struct list_head *resources) | |||
| 218 | * the mem resource for this bus | 218 | * the mem resource for this bus |
| 219 | * the prefetch mem resource for this bus | 219 | * the prefetch mem resource for this bus |
| 220 | */ | 220 | */ |
| 221 | pci_add_resource_offset(resources, &io_mem, sys->io_offset); | 221 | pci_add_resource_offset(&sys->resources, &io_mem, sys->io_offset); |
| 222 | pci_add_resource_offset(resources, &non_mem, sys->mem_offset); | 222 | pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset); |
| 223 | pci_add_resource_offset(resources, &pre_mem, sys->mem_offset); | 223 | pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset); |
| 224 | 224 | ||
| 225 | goto out; | 225 | goto out; |
| 226 | 226 | ||
| @@ -249,7 +249,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys) | |||
| 249 | 249 | ||
| 250 | if (nr == 0) { | 250 | if (nr == 0) { |
| 251 | sys->mem_offset = 0; | 251 | sys->mem_offset = 0; |
| 252 | ret = pci_versatile_setup_resources(&sys->resources); | 252 | ret = pci_versatile_setup_resources(sys); |
| 253 | if (ret < 0) { | 253 | if (ret < 0) { |
| 254 | printk("pci_versatile_setup: resources... oops?\n"); | 254 | printk("pci_versatile_setup: resources... oops?\n"); |
| 255 | goto out; | 255 | goto out; |
diff --git a/arch/arm/plat-mxc/3ds_debugboard.c b/arch/arm/plat-mxc/3ds_debugboard.c index d1e31fa1b0c3..5cac2c540f4f 100644 --- a/arch/arm/plat-mxc/3ds_debugboard.c +++ b/arch/arm/plat-mxc/3ds_debugboard.c | |||
| @@ -80,7 +80,7 @@ static struct smsc911x_platform_config smsc911x_config = { | |||
| 80 | 80 | ||
| 81 | static struct platform_device smsc_lan9217_device = { | 81 | static struct platform_device smsc_lan9217_device = { |
| 82 | .name = "smsc911x", | 82 | .name = "smsc911x", |
| 83 | .id = 0, | 83 | .id = -1, |
| 84 | .dev = { | 84 | .dev = { |
| 85 | .platform_data = &smsc911x_config, | 85 | .platform_data = &smsc911x_config, |
| 86 | }, | 86 | }, |
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig index ce1e9b96ba1a..ad95c7a5d009 100644 --- a/arch/arm/plat-omap/Kconfig +++ b/arch/arm/plat-omap/Kconfig | |||
| @@ -17,6 +17,7 @@ config ARCH_OMAP1 | |||
| 17 | select IRQ_DOMAIN | 17 | select IRQ_DOMAIN |
| 18 | select HAVE_IDE | 18 | select HAVE_IDE |
| 19 | select NEED_MACH_MEMORY_H | 19 | select NEED_MACH_MEMORY_H |
| 20 | select NEED_MACH_IO_H if PCCARD | ||
| 20 | help | 21 | help |
| 21 | "Systems based on omap7xx, omap15xx or omap16xx" | 22 | "Systems based on omap7xx, omap15xx or omap16xx" |
| 22 | 23 | ||
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 56b6f8b7053e..8506cbb7fea4 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
| @@ -441,6 +441,8 @@ static int __init clk_disable_unused(void) | |||
| 441 | return 0; | 441 | return 0; |
| 442 | 442 | ||
| 443 | pr_info("clock: disabling unused clocks to save power\n"); | 443 | pr_info("clock: disabling unused clocks to save power\n"); |
| 444 | |||
| 445 | spin_lock_irqsave(&clockfw_lock, flags); | ||
| 444 | list_for_each_entry(ck, &clocks, node) { | 446 | list_for_each_entry(ck, &clocks, node) { |
| 445 | if (ck->ops == &clkops_null) | 447 | if (ck->ops == &clkops_null) |
| 446 | continue; | 448 | continue; |
| @@ -448,10 +450,9 @@ static int __init clk_disable_unused(void) | |||
| 448 | if (ck->usecount > 0 || !ck->enable_reg) | 450 | if (ck->usecount > 0 || !ck->enable_reg) |
| 449 | continue; | 451 | continue; |
| 450 | 452 | ||
| 451 | spin_lock_irqsave(&clockfw_lock, flags); | ||
| 452 | arch_clock->clk_disable_unused(ck); | 453 | arch_clock->clk_disable_unused(ck); |
| 453 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
| 454 | } | 454 | } |
| 455 | spin_unlock_irqrestore(&clockfw_lock, flags); | ||
| 455 | 456 | ||
| 456 | return 0; | 457 | return 0; |
| 457 | } | 458 | } |
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 9e8e63d52aab..8070145ccb98 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h | |||
| @@ -47,17 +47,17 @@ extern struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2; | |||
| 47 | * with the original PRCM protocol defined for OMAP2420 | 47 | * with the original PRCM protocol defined for OMAP2420 |
| 48 | */ | 48 | */ |
| 49 | #define SYSC_TYPE1_MIDLEMODE_SHIFT 12 | 49 | #define SYSC_TYPE1_MIDLEMODE_SHIFT 12 |
| 50 | #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_MIDLEMODE_SHIFT) | 50 | #define SYSC_TYPE1_MIDLEMODE_MASK (0x3 << SYSC_TYPE1_MIDLEMODE_SHIFT) |
| 51 | #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8 | 51 | #define SYSC_TYPE1_CLOCKACTIVITY_SHIFT 8 |
| 52 | #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_CLOCKACTIVITY_SHIFT) | 52 | #define SYSC_TYPE1_CLOCKACTIVITY_MASK (0x3 << SYSC_TYPE1_CLOCKACTIVITY_SHIFT) |
| 53 | #define SYSC_TYPE1_SIDLEMODE_SHIFT 3 | 53 | #define SYSC_TYPE1_SIDLEMODE_SHIFT 3 |
| 54 | #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_SIDLEMODE_SHIFT) | 54 | #define SYSC_TYPE1_SIDLEMODE_MASK (0x3 << SYSC_TYPE1_SIDLEMODE_SHIFT) |
| 55 | #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2 | 55 | #define SYSC_TYPE1_ENAWAKEUP_SHIFT 2 |
| 56 | #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_ENAWAKEUP_SHIFT) | 56 | #define SYSC_TYPE1_ENAWAKEUP_MASK (1 << SYSC_TYPE1_ENAWAKEUP_SHIFT) |
| 57 | #define SYSC_TYPE1_SOFTRESET_SHIFT 1 | 57 | #define SYSC_TYPE1_SOFTRESET_SHIFT 1 |
| 58 | #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_SOFTRESET_SHIFT) | 58 | #define SYSC_TYPE1_SOFTRESET_MASK (1 << SYSC_TYPE1_SOFTRESET_SHIFT) |
| 59 | #define SYSC_TYPE1_AUTOIDLE_SHIFT 0 | 59 | #define SYSC_TYPE1_AUTOIDLE_SHIFT 0 |
| 60 | #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_AUTOIDLE_SHIFT) | 60 | #define SYSC_TYPE1_AUTOIDLE_MASK (1 << SYSC_TYPE1_AUTOIDLE_SHIFT) |
| 61 | 61 | ||
| 62 | /* | 62 | /* |
| 63 | * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant | 63 | * OCP SYSCONFIG bit shifts/masks TYPE2. These are for IPs compliant |
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index c1269a1085e1..373a6902d8fa 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
| @@ -823,7 +823,7 @@ config CACHELINE_ALIGNED_L1 | |||
| 823 | bool "Locate cacheline_aligned data to L1 Data Memory" | 823 | bool "Locate cacheline_aligned data to L1 Data Memory" |
| 824 | default y if !BF54x | 824 | default y if !BF54x |
| 825 | default n if BF54x | 825 | default n if BF54x |
| 826 | depends on !SMP && !BF531 | 826 | depends on !SMP && !BF531 && !CRC32 |
| 827 | help | 827 | help |
| 828 | If enabled, cacheline_aligned data is linked | 828 | If enabled, cacheline_aligned data is linked |
| 829 | into L1 data memory. (less latency) | 829 | into L1 data memory. (less latency) |
diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig index 9ccc18a6b4df..90b175323644 100644 --- a/arch/blackfin/configs/BF527-EZKIT_defconfig +++ b/arch/blackfin/configs/BF527-EZKIT_defconfig | |||
| @@ -147,6 +147,7 @@ CONFIG_USB_OTG_BLACKLIST_HUB=y | |||
| 147 | CONFIG_USB_MON=y | 147 | CONFIG_USB_MON=y |
| 148 | CONFIG_USB_MUSB_HDRC=y | 148 | CONFIG_USB_MUSB_HDRC=y |
| 149 | CONFIG_USB_MUSB_BLACKFIN=y | 149 | CONFIG_USB_MUSB_BLACKFIN=y |
| 150 | CONFIG_MUSB_PIO_ONLY=y | ||
| 150 | CONFIG_USB_STORAGE=y | 151 | CONFIG_USB_STORAGE=y |
| 151 | CONFIG_USB_GADGET=y | 152 | CONFIG_USB_GADGET=y |
| 152 | CONFIG_RTC_CLASS=y | 153 | CONFIG_RTC_CLASS=y |
diff --git a/arch/blackfin/include/asm/gpio.h b/arch/blackfin/include/asm/gpio.h index 5a25856381ff..12d3571b5232 100644 --- a/arch/blackfin/include/asm/gpio.h +++ b/arch/blackfin/include/asm/gpio.h | |||
| @@ -244,16 +244,26 @@ static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) | |||
| 244 | return -EINVAL; | 244 | return -EINVAL; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | static inline int gpio_get_value(unsigned gpio) | 247 | static inline int __gpio_get_value(unsigned gpio) |
| 248 | { | 248 | { |
| 249 | return bfin_gpio_get_value(gpio); | 249 | return bfin_gpio_get_value(gpio); |
| 250 | } | 250 | } |
| 251 | 251 | ||
| 252 | static inline void gpio_set_value(unsigned gpio, int value) | 252 | static inline void __gpio_set_value(unsigned gpio, int value) |
| 253 | { | 253 | { |
| 254 | return bfin_gpio_set_value(gpio, value); | 254 | return bfin_gpio_set_value(gpio, value); |
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | static inline int gpio_get_value(unsigned gpio) | ||
| 258 | { | ||
| 259 | return __gpio_get_value(gpio); | ||
| 260 | } | ||
| 261 | |||
| 262 | static inline void gpio_set_value(unsigned gpio, int value) | ||
| 263 | { | ||
| 264 | return __gpio_set_value(gpio, value); | ||
| 265 | } | ||
| 266 | |||
| 257 | static inline int gpio_to_irq(unsigned gpio) | 267 | static inline int gpio_to_irq(unsigned gpio) |
| 258 | { | 268 | { |
| 259 | if (likely(gpio < MAX_BLACKFIN_GPIOS)) | 269 | if (likely(gpio < MAX_BLACKFIN_GPIOS)) |
diff --git a/arch/c6x/kernel/signal.c b/arch/c6x/kernel/signal.c index 304f675826e9..3b5a05099989 100644 --- a/arch/c6x/kernel/signal.c +++ b/arch/c6x/kernel/signal.c | |||
| @@ -85,10 +85,7 @@ asmlinkage int do_rt_sigreturn(struct pt_regs *regs) | |||
| 85 | goto badframe; | 85 | goto badframe; |
| 86 | 86 | ||
| 87 | sigdelsetmask(&set, ~_BLOCKABLE); | 87 | sigdelsetmask(&set, ~_BLOCKABLE); |
| 88 | spin_lock_irq(¤t->sighand->siglock); | 88 | set_current_blocked(&set); |
| 89 | current->blocked = set; | ||
| 90 | recalc_sigpending(); | ||
| 91 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 92 | 89 | ||
| 93 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 90 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 94 | goto badframe; | 91 | goto badframe; |
| @@ -279,15 +276,8 @@ static int handle_signal(int sig, | |||
| 279 | 276 | ||
| 280 | /* Set up the stack frame */ | 277 | /* Set up the stack frame */ |
| 281 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 278 | ret = setup_rt_frame(sig, ka, info, oldset, regs); |
| 282 | if (ret == 0) { | 279 | if (ret == 0) |
| 283 | spin_lock_irq(¤t->sighand->siglock); | 280 | block_sigmask(ka, sig); |
| 284 | sigorsets(¤t->blocked, ¤t->blocked, | ||
| 285 | &ka->sa.sa_mask); | ||
| 286 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
| 287 | sigaddset(¤t->blocked, sig); | ||
| 288 | recalc_sigpending(); | ||
| 289 | spin_unlock_irq(¤t->sighand->siglock); | ||
| 290 | } | ||
| 291 | 281 | ||
| 292 | return ret; | 282 | return ret; |
| 293 | } | 283 | } |
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 11270ca22c0a..96033e2d6845 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
| @@ -12,7 +12,7 @@ config TILE | |||
| 12 | select GENERIC_PENDING_IRQ if SMP | 12 | select GENERIC_PENDING_IRQ if SMP |
| 13 | select GENERIC_IRQ_SHOW | 13 | select GENERIC_IRQ_SHOW |
| 14 | select SYS_HYPERVISOR | 14 | select SYS_HYPERVISOR |
| 15 | select ARCH_HAVE_NMI_SAFE_CMPXCHG if !M386 | 15 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
| 16 | 16 | ||
| 17 | # FIXME: investigate whether we need/want these options. | 17 | # FIXME: investigate whether we need/want these options. |
| 18 | # select HAVE_IOREMAP_PROT | 18 | # select HAVE_IOREMAP_PROT |
| @@ -69,6 +69,9 @@ config ARCH_PHYS_ADDR_T_64BIT | |||
| 69 | config ARCH_DMA_ADDR_T_64BIT | 69 | config ARCH_DMA_ADDR_T_64BIT |
| 70 | def_bool y | 70 | def_bool y |
| 71 | 71 | ||
| 72 | config NEED_DMA_MAP_STATE | ||
| 73 | def_bool y | ||
| 74 | |||
| 72 | config LOCKDEP_SUPPORT | 75 | config LOCKDEP_SUPPORT |
| 73 | def_bool y | 76 | def_bool y |
| 74 | 77 | ||
| @@ -118,7 +121,7 @@ config 64BIT | |||
| 118 | 121 | ||
| 119 | config ARCH_DEFCONFIG | 122 | config ARCH_DEFCONFIG |
| 120 | string | 123 | string |
| 121 | default "arch/tile/configs/tile_defconfig" if !TILEGX | 124 | default "arch/tile/configs/tilepro_defconfig" if !TILEGX |
| 122 | default "arch/tile/configs/tilegx_defconfig" if TILEGX | 125 | default "arch/tile/configs/tilegx_defconfig" if TILEGX |
| 123 | 126 | ||
| 124 | source "init/Kconfig" | 127 | source "init/Kconfig" |
| @@ -240,6 +243,7 @@ endchoice | |||
| 240 | 243 | ||
| 241 | config PAGE_OFFSET | 244 | config PAGE_OFFSET |
| 242 | hex | 245 | hex |
| 246 | depends on !64BIT | ||
| 243 | default 0xF0000000 if VMSPLIT_3_75G | 247 | default 0xF0000000 if VMSPLIT_3_75G |
| 244 | default 0xE0000000 if VMSPLIT_3_5G | 248 | default 0xE0000000 if VMSPLIT_3_5G |
| 245 | default 0xB0000000 if VMSPLIT_2_75G | 249 | default 0xB0000000 if VMSPLIT_2_75G |
diff --git a/arch/tile/Makefile b/arch/tile/Makefile index 17acce70569b..9520bc5a4b7f 100644 --- a/arch/tile/Makefile +++ b/arch/tile/Makefile | |||
| @@ -30,7 +30,8 @@ ifneq ($(CONFIG_DEBUG_EXTRA_FLAGS),"") | |||
| 30 | KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS) | 30 | KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS) |
| 31 | endif | 31 | endif |
| 32 | 32 | ||
| 33 | LIBGCC_PATH := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) | 33 | LIBGCC_PATH := \ |
| 34 | $(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name) | ||
| 34 | 35 | ||
| 35 | # Provide the path to use for "make defconfig". | 36 | # Provide the path to use for "make defconfig". |
| 36 | KBUILD_DEFCONFIG := $(ARCH)_defconfig | 37 | KBUILD_DEFCONFIG := $(ARCH)_defconfig |
| @@ -53,8 +54,6 @@ libs-y += $(LIBGCC_PATH) | |||
| 53 | # See arch/tile/Kbuild for content of core part of the kernel | 54 | # See arch/tile/Kbuild for content of core part of the kernel |
| 54 | core-y += arch/tile/ | 55 | core-y += arch/tile/ |
| 55 | 56 | ||
| 56 | core-$(CONFIG_KVM) += arch/tile/kvm/ | ||
| 57 | |||
| 58 | ifdef TILERA_ROOT | 57 | ifdef TILERA_ROOT |
| 59 | INSTALL_PATH ?= $(TILERA_ROOT)/tile/boot | 58 | INSTALL_PATH ?= $(TILERA_ROOT)/tile/boot |
| 60 | endif | 59 | endif |
diff --git a/arch/tile/include/arch/spr_def.h b/arch/tile/include/arch/spr_def.h index f548efeb2de3..d6ba449b5363 100644 --- a/arch/tile/include/arch/spr_def.h +++ b/arch/tile/include/arch/spr_def.h | |||
| @@ -60,8 +60,8 @@ | |||
| 60 | _concat4(SPR_IPI_EVENT_, CONFIG_KERNEL_PL,,) | 60 | _concat4(SPR_IPI_EVENT_, CONFIG_KERNEL_PL,,) |
| 61 | #define SPR_IPI_EVENT_RESET_K \ | 61 | #define SPR_IPI_EVENT_RESET_K \ |
| 62 | _concat4(SPR_IPI_EVENT_RESET_, CONFIG_KERNEL_PL,,) | 62 | _concat4(SPR_IPI_EVENT_RESET_, CONFIG_KERNEL_PL,,) |
| 63 | #define SPR_IPI_MASK_SET_K \ | 63 | #define SPR_IPI_EVENT_SET_K \ |
| 64 | _concat4(SPR_IPI_MASK_SET_, CONFIG_KERNEL_PL,,) | 64 | _concat4(SPR_IPI_EVENT_SET_, CONFIG_KERNEL_PL,,) |
| 65 | #define INT_IPI_K \ | 65 | #define INT_IPI_K \ |
| 66 | _concat4(INT_IPI_, CONFIG_KERNEL_PL,,) | 66 | _concat4(INT_IPI_, CONFIG_KERNEL_PL,,) |
| 67 | 67 | ||
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h index bb696da5d7cd..f2461429a4a4 100644 --- a/arch/tile/include/asm/atomic.h +++ b/arch/tile/include/asm/atomic.h | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | #ifndef _ASM_TILE_ATOMIC_H | 17 | #ifndef _ASM_TILE_ATOMIC_H |
| 18 | #define _ASM_TILE_ATOMIC_H | 18 | #define _ASM_TILE_ATOMIC_H |
| 19 | 19 | ||
| 20 | #include <asm/cmpxchg.h> | ||
| 21 | |||
| 20 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
| 21 | 23 | ||
| 22 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
| @@ -121,54 +123,6 @@ static inline int atomic_read(const atomic_t *v) | |||
| 121 | */ | 123 | */ |
| 122 | #define atomic_add_negative(i, v) (atomic_add_return((i), (v)) < 0) | 124 | #define atomic_add_negative(i, v) (atomic_add_return((i), (v)) < 0) |
| 123 | 125 | ||
| 124 | /* Nonexistent functions intended to cause link errors. */ | ||
| 125 | extern unsigned long __xchg_called_with_bad_pointer(void); | ||
| 126 | extern unsigned long __cmpxchg_called_with_bad_pointer(void); | ||
| 127 | |||
| 128 | #define xchg(ptr, x) \ | ||
| 129 | ({ \ | ||
| 130 | typeof(*(ptr)) __x; \ | ||
| 131 | switch (sizeof(*(ptr))) { \ | ||
| 132 | case 4: \ | ||
| 133 | __x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \ | ||
| 134 | (atomic_t *)(ptr), \ | ||
| 135 | (u32)(typeof((x)-(x)))(x)); \ | ||
| 136 | break; \ | ||
| 137 | case 8: \ | ||
| 138 | __x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \ | ||
| 139 | (atomic64_t *)(ptr), \ | ||
| 140 | (u64)(typeof((x)-(x)))(x)); \ | ||
| 141 | break; \ | ||
| 142 | default: \ | ||
| 143 | __xchg_called_with_bad_pointer(); \ | ||
| 144 | } \ | ||
| 145 | __x; \ | ||
| 146 | }) | ||
| 147 | |||
| 148 | #define cmpxchg(ptr, o, n) \ | ||
| 149 | ({ \ | ||
| 150 | typeof(*(ptr)) __x; \ | ||
| 151 | switch (sizeof(*(ptr))) { \ | ||
| 152 | case 4: \ | ||
| 153 | __x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \ | ||
| 154 | (atomic_t *)(ptr), \ | ||
| 155 | (u32)(typeof((o)-(o)))(o), \ | ||
| 156 | (u32)(typeof((n)-(n)))(n)); \ | ||
| 157 | break; \ | ||
| 158 | case 8: \ | ||
| 159 | __x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \ | ||
| 160 | (atomic64_t *)(ptr), \ | ||
| 161 | (u64)(typeof((o)-(o)))(o), \ | ||
| 162 | (u64)(typeof((n)-(n)))(n)); \ | ||
| 163 | break; \ | ||
| 164 | default: \ | ||
| 165 | __cmpxchg_called_with_bad_pointer(); \ | ||
| 166 | } \ | ||
| 167 | __x; \ | ||
| 168 | }) | ||
| 169 | |||
| 170 | #define tas(ptr) (xchg((ptr), 1)) | ||
| 171 | |||
| 172 | #endif /* __ASSEMBLY__ */ | 126 | #endif /* __ASSEMBLY__ */ |
| 173 | 127 | ||
| 174 | #ifndef __tilegx__ | 128 | #ifndef __tilegx__ |
diff --git a/arch/tile/include/asm/atomic_32.h b/arch/tile/include/asm/atomic_32.h index 466dc4a39a4f..54d1da826f93 100644 --- a/arch/tile/include/asm/atomic_32.h +++ b/arch/tile/include/asm/atomic_32.h | |||
| @@ -200,7 +200,7 @@ static inline u64 atomic64_add_return(u64 i, atomic64_t *v) | |||
| 200 | * @u: ...unless v is equal to u. | 200 | * @u: ...unless v is equal to u. |
| 201 | * | 201 | * |
| 202 | * Atomically adds @a to @v, so long as @v was not already @u. | 202 | * Atomically adds @a to @v, so long as @v was not already @u. |
| 203 | * Returns the old value of @v. | 203 | * Returns non-zero if @v was not @u, and zero otherwise. |
| 204 | */ | 204 | */ |
| 205 | static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u) | 205 | static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u) |
| 206 | { | 206 | { |
diff --git a/arch/tile/include/asm/bitops_64.h b/arch/tile/include/asm/bitops_64.h index 58d021a9834f..60b87ee54fb8 100644 --- a/arch/tile/include/asm/bitops_64.h +++ b/arch/tile/include/asm/bitops_64.h | |||
| @@ -38,10 +38,10 @@ static inline void clear_bit(unsigned nr, volatile unsigned long *addr) | |||
| 38 | 38 | ||
| 39 | static inline void change_bit(unsigned nr, volatile unsigned long *addr) | 39 | static inline void change_bit(unsigned nr, volatile unsigned long *addr) |
| 40 | { | 40 | { |
| 41 | unsigned long old, mask = (1UL << (nr % BITS_PER_LONG)); | 41 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); |
| 42 | long guess, oldval; | 42 | unsigned long guess, oldval; |
| 43 | addr += nr / BITS_PER_LONG; | 43 | addr += nr / BITS_PER_LONG; |
| 44 | old = *addr; | 44 | oldval = *addr; |
| 45 | do { | 45 | do { |
| 46 | guess = oldval; | 46 | guess = oldval; |
| 47 | oldval = atomic64_cmpxchg((atomic64_t *)addr, | 47 | oldval = atomic64_cmpxchg((atomic64_t *)addr, |
| @@ -85,7 +85,7 @@ static inline int test_and_change_bit(unsigned nr, | |||
| 85 | volatile unsigned long *addr) | 85 | volatile unsigned long *addr) |
| 86 | { | 86 | { |
| 87 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); | 87 | unsigned long mask = (1UL << (nr % BITS_PER_LONG)); |
| 88 | long guess, oldval = *addr; | 88 | unsigned long guess, oldval; |
| 89 | addr += nr / BITS_PER_LONG; | 89 | addr += nr / BITS_PER_LONG; |
| 90 | oldval = *addr; | 90 | oldval = *addr; |
| 91 | do { | 91 | do { |
diff --git a/arch/tile/include/asm/cmpxchg.h b/arch/tile/include/asm/cmpxchg.h new file mode 100644 index 000000000000..276f067e3640 --- /dev/null +++ b/arch/tile/include/asm/cmpxchg.h | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | /* | ||
| 2 | * cmpxchg.h -- forked from asm/atomic.h with this copyright: | ||
| 3 | * | ||
| 4 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation, version 2. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, but | ||
| 11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 13 | * NON INFRINGEMENT. See the GNU General Public License for | ||
| 14 | * more details. | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef _ASM_TILE_CMPXCHG_H | ||
| 19 | #define _ASM_TILE_CMPXCHG_H | ||
| 20 | |||
| 21 | #ifndef __ASSEMBLY__ | ||
| 22 | |||
| 23 | /* Nonexistent functions intended to cause link errors. */ | ||
| 24 | extern unsigned long __xchg_called_with_bad_pointer(void); | ||
| 25 | extern unsigned long __cmpxchg_called_with_bad_pointer(void); | ||
| 26 | |||
| 27 | #define xchg(ptr, x) \ | ||
| 28 | ({ \ | ||
| 29 | typeof(*(ptr)) __x; \ | ||
| 30 | switch (sizeof(*(ptr))) { \ | ||
| 31 | case 4: \ | ||
| 32 | __x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \ | ||
| 33 | (atomic_t *)(ptr), \ | ||
| 34 | (u32)(typeof((x)-(x)))(x)); \ | ||
| 35 | break; \ | ||
| 36 | case 8: \ | ||
| 37 | __x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \ | ||
| 38 | (atomic64_t *)(ptr), \ | ||
| 39 | (u64)(typeof((x)-(x)))(x)); \ | ||
| 40 | break; \ | ||
| 41 | default: \ | ||
| 42 | __xchg_called_with_bad_pointer(); \ | ||
| 43 | } \ | ||
| 44 | __x; \ | ||
| 45 | }) | ||
| 46 | |||
| 47 | #define cmpxchg(ptr, o, n) \ | ||
| 48 | ({ \ | ||
| 49 | typeof(*(ptr)) __x; \ | ||
| 50 | switch (sizeof(*(ptr))) { \ | ||
| 51 | case 4: \ | ||
| 52 | __x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \ | ||
| 53 | (atomic_t *)(ptr), \ | ||
| 54 | (u32)(typeof((o)-(o)))(o), \ | ||
| 55 | (u32)(typeof((n)-(n)))(n)); \ | ||
| 56 | break; \ | ||
| 57 | case 8: \ | ||
| 58 | __x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \ | ||
| 59 | (atomic64_t *)(ptr), \ | ||
| 60 | (u64)(typeof((o)-(o)))(o), \ | ||
| 61 | (u64)(typeof((n)-(n)))(n)); \ | ||
| 62 | break; \ | ||
| 63 | default: \ | ||
| 64 | __cmpxchg_called_with_bad_pointer(); \ | ||
| 65 | } \ | ||
| 66 | __x; \ | ||
| 67 | }) | ||
| 68 | |||
| 69 | #define tas(ptr) (xchg((ptr), 1)) | ||
| 70 | |||
| 71 | #endif /* __ASSEMBLY__ */ | ||
| 72 | |||
| 73 | #endif /* _ASM_TILE_CMPXCHG_H */ | ||
diff --git a/arch/tile/include/asm/irq.h b/arch/tile/include/asm/irq.h index f80f8ceabc67..33cff9a3058b 100644 --- a/arch/tile/include/asm/irq.h +++ b/arch/tile/include/asm/irq.h | |||
| @@ -21,7 +21,7 @@ | |||
| 21 | #define NR_IRQS 32 | 21 | #define NR_IRQS 32 |
| 22 | 22 | ||
| 23 | /* IRQ numbers used for linux IPIs. */ | 23 | /* IRQ numbers used for linux IPIs. */ |
| 24 | #define IRQ_RESCHEDULE 1 | 24 | #define IRQ_RESCHEDULE 0 |
| 25 | 25 | ||
| 26 | #define irq_canonicalize(irq) (irq) | 26 | #define irq_canonicalize(irq) (irq) |
| 27 | 27 | ||
diff --git a/arch/tile/include/asm/spinlock_64.h b/arch/tile/include/asm/spinlock_64.h index 72be5904e020..5f8b6a095fd8 100644 --- a/arch/tile/include/asm/spinlock_64.h +++ b/arch/tile/include/asm/spinlock_64.h | |||
| @@ -137,7 +137,7 @@ static inline void arch_read_unlock(arch_rwlock_t *rw) | |||
| 137 | static inline void arch_write_unlock(arch_rwlock_t *rw) | 137 | static inline void arch_write_unlock(arch_rwlock_t *rw) |
| 138 | { | 138 | { |
| 139 | __insn_mf(); | 139 | __insn_mf(); |
| 140 | rw->lock = 0; | 140 | __insn_exch4(&rw->lock, 0); /* Avoid waiting in the write buffer. */ |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static inline int arch_read_trylock(arch_rwlock_t *rw) | 143 | static inline int arch_read_trylock(arch_rwlock_t *rw) |
diff --git a/arch/tile/include/asm/stack.h b/arch/tile/include/asm/stack.h index 4d97a2db932e..0e9d382a2d45 100644 --- a/arch/tile/include/asm/stack.h +++ b/arch/tile/include/asm/stack.h | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | struct KBacktraceIterator { | 25 | struct KBacktraceIterator { |
| 26 | BacktraceIterator it; | 26 | BacktraceIterator it; |
| 27 | struct task_struct *task; /* task we are backtracing */ | 27 | struct task_struct *task; /* task we are backtracing */ |
| 28 | pte_t *pgtable; /* page table for user space access */ | ||
| 29 | int end; /* iteration complete. */ | 28 | int end; /* iteration complete. */ |
| 30 | int new_context; /* new context is starting */ | 29 | int new_context; /* new context is starting */ |
| 31 | int profile; /* profiling, so stop on async intrpt */ | 30 | int profile; /* profiling, so stop on async intrpt */ |
diff --git a/arch/tile/include/asm/traps.h b/arch/tile/include/asm/traps.h index 5f20f920f932..e28c3df4176a 100644 --- a/arch/tile/include/asm/traps.h +++ b/arch/tile/include/asm/traps.h | |||
| @@ -64,7 +64,11 @@ void do_breakpoint(struct pt_regs *, int fault_num); | |||
| 64 | 64 | ||
| 65 | 65 | ||
| 66 | #ifdef __tilegx__ | 66 | #ifdef __tilegx__ |
| 67 | /* kernel/single_step.c */ | ||
| 67 | void gx_singlestep_handle(struct pt_regs *, int fault_num); | 68 | void gx_singlestep_handle(struct pt_regs *, int fault_num); |
| 69 | |||
| 70 | /* kernel/intvec_64.S */ | ||
| 71 | void fill_ra_stack(void); | ||
| 68 | #endif | 72 | #endif |
| 69 | 73 | ||
| 70 | #endif /* _ASM_TILE_SYSCALLS_H */ | 74 | #endif /* _ASM_TILE_TRAPS_H */ |
diff --git a/arch/tile/kernel/entry.S b/arch/tile/kernel/entry.S index 431e9ae60488..ec91568df880 100644 --- a/arch/tile/kernel/entry.S +++ b/arch/tile/kernel/entry.S | |||
| @@ -85,6 +85,7 @@ STD_ENTRY(cpu_idle_on_new_stack) | |||
| 85 | /* Loop forever on a nap during SMP boot. */ | 85 | /* Loop forever on a nap during SMP boot. */ |
| 86 | STD_ENTRY(smp_nap) | 86 | STD_ENTRY(smp_nap) |
| 87 | nap | 87 | nap |
| 88 | nop /* avoid provoking the icache prefetch with a jump */ | ||
| 88 | j smp_nap /* we are not architecturally guaranteed not to exit nap */ | 89 | j smp_nap /* we are not architecturally guaranteed not to exit nap */ |
| 89 | jrp lr /* clue in the backtracer */ | 90 | jrp lr /* clue in the backtracer */ |
| 90 | STD_ENDPROC(smp_nap) | 91 | STD_ENDPROC(smp_nap) |
| @@ -105,5 +106,6 @@ STD_ENTRY(_cpu_idle) | |||
| 105 | .global _cpu_idle_nap | 106 | .global _cpu_idle_nap |
| 106 | _cpu_idle_nap: | 107 | _cpu_idle_nap: |
| 107 | nap | 108 | nap |
| 109 | nop /* avoid provoking the icache prefetch with a jump */ | ||
| 108 | jrp lr | 110 | jrp lr |
| 109 | STD_ENDPROC(_cpu_idle) | 111 | STD_ENDPROC(_cpu_idle) |
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S index aecc8ed5f39b..5d56a1ef5ba5 100644 --- a/arch/tile/kernel/intvec_32.S +++ b/arch/tile/kernel/intvec_32.S | |||
| @@ -799,6 +799,10 @@ handle_interrupt: | |||
| 799 | * This routine takes a boolean in r30 indicating if this is an NMI. | 799 | * This routine takes a boolean in r30 indicating if this is an NMI. |
| 800 | * If so, we also expect a boolean in r31 indicating whether to | 800 | * If so, we also expect a boolean in r31 indicating whether to |
| 801 | * re-enable the oprofile interrupts. | 801 | * re-enable the oprofile interrupts. |
| 802 | * | ||
| 803 | * Note that .Lresume_userspace is jumped to directly in several | ||
| 804 | * places, and we need to make sure r30 is set correctly in those | ||
| 805 | * callers as well. | ||
| 802 | */ | 806 | */ |
| 803 | STD_ENTRY(interrupt_return) | 807 | STD_ENTRY(interrupt_return) |
| 804 | /* If we're resuming to kernel space, don't check thread flags. */ | 808 | /* If we're resuming to kernel space, don't check thread flags. */ |
| @@ -1237,7 +1241,10 @@ handle_syscall: | |||
| 1237 | bzt r30, 1f | 1241 | bzt r30, 1f |
| 1238 | jal do_syscall_trace | 1242 | jal do_syscall_trace |
| 1239 | FEEDBACK_REENTER(handle_syscall) | 1243 | FEEDBACK_REENTER(handle_syscall) |
| 1240 | 1: j .Lresume_userspace /* jump into middle of interrupt_return */ | 1244 | 1: { |
| 1245 | movei r30, 0 /* not an NMI */ | ||
| 1246 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1247 | } | ||
| 1241 | 1248 | ||
| 1242 | .Linvalid_syscall: | 1249 | .Linvalid_syscall: |
| 1243 | /* Report an invalid syscall back to the user program */ | 1250 | /* Report an invalid syscall back to the user program */ |
| @@ -1246,7 +1253,10 @@ handle_syscall: | |||
| 1246 | movei r28, -ENOSYS | 1253 | movei r28, -ENOSYS |
| 1247 | } | 1254 | } |
| 1248 | sw r29, r28 | 1255 | sw r29, r28 |
| 1249 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1256 | { |
| 1257 | movei r30, 0 /* not an NMI */ | ||
| 1258 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1259 | } | ||
| 1250 | STD_ENDPROC(handle_syscall) | 1260 | STD_ENDPROC(handle_syscall) |
| 1251 | 1261 | ||
| 1252 | /* Return the address for oprofile to suppress in backtraces. */ | 1262 | /* Return the address for oprofile to suppress in backtraces. */ |
| @@ -1262,7 +1272,10 @@ STD_ENTRY(ret_from_fork) | |||
| 1262 | jal sim_notify_fork | 1272 | jal sim_notify_fork |
| 1263 | jal schedule_tail | 1273 | jal schedule_tail |
| 1264 | FEEDBACK_REENTER(ret_from_fork) | 1274 | FEEDBACK_REENTER(ret_from_fork) |
| 1265 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1275 | { |
| 1276 | movei r30, 0 /* not an NMI */ | ||
| 1277 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1278 | } | ||
| 1266 | STD_ENDPROC(ret_from_fork) | 1279 | STD_ENDPROC(ret_from_fork) |
| 1267 | 1280 | ||
| 1268 | /* | 1281 | /* |
| @@ -1376,7 +1389,10 @@ handle_ill: | |||
| 1376 | 1389 | ||
| 1377 | jal send_sigtrap /* issue a SIGTRAP */ | 1390 | jal send_sigtrap /* issue a SIGTRAP */ |
| 1378 | FEEDBACK_REENTER(handle_ill) | 1391 | FEEDBACK_REENTER(handle_ill) |
| 1379 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1392 | { |
| 1393 | movei r30, 0 /* not an NMI */ | ||
| 1394 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1395 | } | ||
| 1380 | 1396 | ||
| 1381 | .Ldispatch_normal_ill: | 1397 | .Ldispatch_normal_ill: |
| 1382 | { | 1398 | { |
diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S index 79c93e10ba27..49d9d6621682 100644 --- a/arch/tile/kernel/intvec_64.S +++ b/arch/tile/kernel/intvec_64.S | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <asm/irqflags.h> | 22 | #include <asm/irqflags.h> |
| 23 | #include <asm/asm-offsets.h> | 23 | #include <asm/asm-offsets.h> |
| 24 | #include <asm/types.h> | 24 | #include <asm/types.h> |
| 25 | #include <asm/signal.h> | ||
| 25 | #include <hv/hypervisor.h> | 26 | #include <hv/hypervisor.h> |
| 26 | #include <arch/abi.h> | 27 | #include <arch/abi.h> |
| 27 | #include <arch/interrupts.h> | 28 | #include <arch/interrupts.h> |
| @@ -605,6 +606,10 @@ handle_interrupt: | |||
| 605 | * This routine takes a boolean in r30 indicating if this is an NMI. | 606 | * This routine takes a boolean in r30 indicating if this is an NMI. |
| 606 | * If so, we also expect a boolean in r31 indicating whether to | 607 | * If so, we also expect a boolean in r31 indicating whether to |
| 607 | * re-enable the oprofile interrupts. | 608 | * re-enable the oprofile interrupts. |
| 609 | * | ||
| 610 | * Note that .Lresume_userspace is jumped to directly in several | ||
| 611 | * places, and we need to make sure r30 is set correctly in those | ||
| 612 | * callers as well. | ||
| 608 | */ | 613 | */ |
| 609 | STD_ENTRY(interrupt_return) | 614 | STD_ENTRY(interrupt_return) |
| 610 | /* If we're resuming to kernel space, don't check thread flags. */ | 615 | /* If we're resuming to kernel space, don't check thread flags. */ |
| @@ -1039,11 +1044,28 @@ handle_syscall: | |||
| 1039 | 1044 | ||
| 1040 | /* Do syscall trace again, if requested. */ | 1045 | /* Do syscall trace again, if requested. */ |
| 1041 | ld r30, r31 | 1046 | ld r30, r31 |
| 1042 | andi r30, r30, _TIF_SYSCALL_TRACE | 1047 | andi r0, r30, _TIF_SYSCALL_TRACE |
| 1043 | beqzt r30, 1f | 1048 | { |
| 1049 | andi r0, r30, _TIF_SINGLESTEP | ||
| 1050 | beqzt r0, 1f | ||
| 1051 | } | ||
| 1044 | jal do_syscall_trace | 1052 | jal do_syscall_trace |
| 1045 | FEEDBACK_REENTER(handle_syscall) | 1053 | FEEDBACK_REENTER(handle_syscall) |
| 1046 | 1: j .Lresume_userspace /* jump into middle of interrupt_return */ | 1054 | andi r0, r30, _TIF_SINGLESTEP |
| 1055 | |||
| 1056 | 1: beqzt r0, 2f | ||
| 1057 | |||
| 1058 | /* Single stepping -- notify ptrace. */ | ||
| 1059 | { | ||
| 1060 | movei r0, SIGTRAP | ||
| 1061 | jal ptrace_notify | ||
| 1062 | } | ||
| 1063 | FEEDBACK_REENTER(handle_syscall) | ||
| 1064 | |||
| 1065 | 2: { | ||
| 1066 | movei r30, 0 /* not an NMI */ | ||
| 1067 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1068 | } | ||
| 1047 | 1069 | ||
| 1048 | .Lcompat_syscall: | 1070 | .Lcompat_syscall: |
| 1049 | /* | 1071 | /* |
| @@ -1077,7 +1099,10 @@ handle_syscall: | |||
| 1077 | movei r28, -ENOSYS | 1099 | movei r28, -ENOSYS |
| 1078 | } | 1100 | } |
| 1079 | st r29, r28 | 1101 | st r29, r28 |
| 1080 | j .Lresume_userspace /* jump into middle of interrupt_return */ | 1102 | { |
| 1103 | movei r30, 0 /* not an NMI */ | ||
| 1104 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1105 | } | ||
| 1081 | STD_ENDPROC(handle_syscall) | 1106 | STD_ENDPROC(handle_syscall) |
| 1082 | 1107 | ||
| 1083 | /* Return the address for oprofile to suppress in backtraces. */ | 1108 | /* Return the address for oprofile to suppress in backtraces. */ |
| @@ -1093,7 +1118,10 @@ STD_ENTRY(ret_from_fork) | |||
| 1093 | jal sim_notify_fork | 1118 | jal sim_notify_fork |
| 1094 | jal schedule_tail | 1119 | jal schedule_tail |
| 1095 | FEEDBACK_REENTER(ret_from_fork) | 1120 | FEEDBACK_REENTER(ret_from_fork) |
| 1096 | j .Lresume_userspace | 1121 | { |
| 1122 | movei r30, 0 /* not an NMI */ | ||
| 1123 | j .Lresume_userspace /* jump into middle of interrupt_return */ | ||
| 1124 | } | ||
| 1097 | STD_ENDPROC(ret_from_fork) | 1125 | STD_ENDPROC(ret_from_fork) |
| 1098 | 1126 | ||
| 1099 | /* Various stub interrupt handlers and syscall handlers */ | 1127 | /* Various stub interrupt handlers and syscall handlers */ |
| @@ -1156,6 +1184,18 @@ int_unalign: | |||
| 1156 | push_extra_callee_saves r0 | 1184 | push_extra_callee_saves r0 |
| 1157 | j do_trap | 1185 | j do_trap |
| 1158 | 1186 | ||
| 1187 | /* Fill the return address stack with nonzero entries. */ | ||
| 1188 | STD_ENTRY(fill_ra_stack) | ||
| 1189 | { | ||
| 1190 | move r0, lr | ||
| 1191 | jal 1f | ||
| 1192 | } | ||
| 1193 | 1: jal 2f | ||
| 1194 | 2: jal 3f | ||
| 1195 | 3: jal 4f | ||
| 1196 | 4: jrp r0 | ||
| 1197 | STD_ENDPROC(fill_ra_stack) | ||
| 1198 | |||
| 1159 | /* Include .intrpt1 array of interrupt vectors */ | 1199 | /* Include .intrpt1 array of interrupt vectors */ |
| 1160 | .section ".intrpt1", "ax" | 1200 | .section ".intrpt1", "ax" |
| 1161 | 1201 | ||
| @@ -1166,7 +1206,7 @@ int_unalign: | |||
| 1166 | #define do_hardwall_trap bad_intr | 1206 | #define do_hardwall_trap bad_intr |
| 1167 | #endif | 1207 | #endif |
| 1168 | 1208 | ||
| 1169 | int_hand INT_MEM_ERROR, MEM_ERROR, bad_intr | 1209 | int_hand INT_MEM_ERROR, MEM_ERROR, do_trap |
| 1170 | int_hand INT_SINGLE_STEP_3, SINGLE_STEP_3, bad_intr | 1210 | int_hand INT_SINGLE_STEP_3, SINGLE_STEP_3, bad_intr |
| 1171 | #if CONFIG_KERNEL_PL == 2 | 1211 | #if CONFIG_KERNEL_PL == 2 |
| 1172 | int_hand INT_SINGLE_STEP_2, SINGLE_STEP_2, gx_singlestep_handle | 1212 | int_hand INT_SINGLE_STEP_2, SINGLE_STEP_2, gx_singlestep_handle |
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index b90ab9925674..98d476920106 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c | |||
| @@ -67,6 +67,8 @@ void *module_alloc(unsigned long size) | |||
| 67 | area = __get_vm_area(size, VM_ALLOC, MEM_MODULE_START, MEM_MODULE_END); | 67 | area = __get_vm_area(size, VM_ALLOC, MEM_MODULE_START, MEM_MODULE_END); |
| 68 | if (!area) | 68 | if (!area) |
| 69 | goto error; | 69 | goto error; |
| 70 | area->nr_pages = npages; | ||
| 71 | area->pages = pages; | ||
| 70 | 72 | ||
| 71 | if (map_vm_area(area, prot_rwx, &pages)) { | 73 | if (map_vm_area(area, prot_rwx, &pages)) { |
| 72 | vunmap(area->addr); | 74 | vunmap(area->addr); |
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c index 30caecac94dc..2d5ef617bb39 100644 --- a/arch/tile/kernel/process.c +++ b/arch/tile/kernel/process.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/tracehook.h> | 28 | #include <linux/tracehook.h> |
| 29 | #include <linux/signal.h> | 29 | #include <linux/signal.h> |
| 30 | #include <asm/stack.h> | 30 | #include <asm/stack.h> |
| 31 | #include <asm/switch_to.h> | ||
| 31 | #include <asm/homecache.h> | 32 | #include <asm/homecache.h> |
| 32 | #include <asm/syscalls.h> | 33 | #include <asm/syscalls.h> |
| 33 | #include <asm/traps.h> | 34 | #include <asm/traps.h> |
| @@ -285,7 +286,7 @@ struct task_struct *validate_current(void) | |||
| 285 | static struct task_struct corrupt = { .comm = "<corrupt>" }; | 286 | static struct task_struct corrupt = { .comm = "<corrupt>" }; |
| 286 | struct task_struct *tsk = current; | 287 | struct task_struct *tsk = current; |
| 287 | if (unlikely((unsigned long)tsk < PAGE_OFFSET || | 288 | if (unlikely((unsigned long)tsk < PAGE_OFFSET || |
| 288 | (void *)tsk > high_memory || | 289 | (high_memory && (void *)tsk > high_memory) || |
| 289 | ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) { | 290 | ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) { |
| 290 | pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer); | 291 | pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer); |
| 291 | tsk = &corrupt; | 292 | tsk = &corrupt; |
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c index 92a94f4920ad..bff23f476110 100644 --- a/arch/tile/kernel/setup.c +++ b/arch/tile/kernel/setup.c | |||
| @@ -103,13 +103,11 @@ unsigned long __initdata pci_reserve_end_pfn = -1U; | |||
| 103 | 103 | ||
| 104 | static int __init setup_maxmem(char *str) | 104 | static int __init setup_maxmem(char *str) |
| 105 | { | 105 | { |
| 106 | long maxmem_mb; | 106 | unsigned long long maxmem; |
| 107 | if (str == NULL || strict_strtol(str, 0, &maxmem_mb) != 0 || | 107 | if (str == NULL || (maxmem = memparse(str, NULL)) == 0) |
| 108 | maxmem_mb == 0) | ||
| 109 | return -EINVAL; | 108 | return -EINVAL; |
| 110 | 109 | ||
| 111 | maxmem_pfn = (maxmem_mb >> (HPAGE_SHIFT - 20)) << | 110 | maxmem_pfn = (maxmem >> HPAGE_SHIFT) << (HPAGE_SHIFT - PAGE_SHIFT); |
| 112 | (HPAGE_SHIFT - PAGE_SHIFT); | ||
| 113 | pr_info("Forcing RAM used to no more than %dMB\n", | 111 | pr_info("Forcing RAM used to no more than %dMB\n", |
| 114 | maxmem_pfn >> (20 - PAGE_SHIFT)); | 112 | maxmem_pfn >> (20 - PAGE_SHIFT)); |
| 115 | return 0; | 113 | return 0; |
| @@ -119,14 +117,15 @@ early_param("maxmem", setup_maxmem); | |||
| 119 | static int __init setup_maxnodemem(char *str) | 117 | static int __init setup_maxnodemem(char *str) |
| 120 | { | 118 | { |
| 121 | char *endp; | 119 | char *endp; |
| 122 | long maxnodemem_mb, node; | 120 | unsigned long long maxnodemem; |
| 121 | long node; | ||
| 123 | 122 | ||
| 124 | node = str ? simple_strtoul(str, &endp, 0) : INT_MAX; | 123 | node = str ? simple_strtoul(str, &endp, 0) : INT_MAX; |
| 125 | if (node >= MAX_NUMNODES || *endp != ':' || | 124 | if (node >= MAX_NUMNODES || *endp != ':') |
| 126 | strict_strtol(endp+1, 0, &maxnodemem_mb) != 0) | ||
| 127 | return -EINVAL; | 125 | return -EINVAL; |
| 128 | 126 | ||
| 129 | maxnodemem_pfn[node] = (maxnodemem_mb >> (HPAGE_SHIFT - 20)) << | 127 | maxnodemem = memparse(endp+1, NULL); |
| 128 | maxnodemem_pfn[node] = (maxnodemem >> HPAGE_SHIFT) << | ||
| 130 | (HPAGE_SHIFT - PAGE_SHIFT); | 129 | (HPAGE_SHIFT - PAGE_SHIFT); |
| 131 | pr_info("Forcing RAM used on node %ld to no more than %dMB\n", | 130 | pr_info("Forcing RAM used on node %ld to no more than %dMB\n", |
| 132 | node, maxnodemem_pfn[node] >> (20 - PAGE_SHIFT)); | 131 | node, maxnodemem_pfn[node] >> (20 - PAGE_SHIFT)); |
| @@ -913,6 +912,13 @@ void __cpuinit setup_cpu(int boot) | |||
| 913 | 912 | ||
| 914 | #ifdef CONFIG_BLK_DEV_INITRD | 913 | #ifdef CONFIG_BLK_DEV_INITRD |
| 915 | 914 | ||
| 915 | /* | ||
| 916 | * Note that the kernel can potentially support other compression | ||
| 917 | * techniques than gz, though we don't do so by default. If we ever | ||
| 918 | * decide to do so we can either look for other filename extensions, | ||
| 919 | * or just allow a file with this name to be compressed with an | ||
| 920 | * arbitrary compressor (somewhat counterintuitively). | ||
| 921 | */ | ||
| 916 | static int __initdata set_initramfs_file; | 922 | static int __initdata set_initramfs_file; |
| 917 | static char __initdata initramfs_file[128] = "initramfs.cpio.gz"; | 923 | static char __initdata initramfs_file[128] = "initramfs.cpio.gz"; |
| 918 | 924 | ||
| @@ -928,9 +934,9 @@ static int __init setup_initramfs_file(char *str) | |||
| 928 | early_param("initramfs_file", setup_initramfs_file); | 934 | early_param("initramfs_file", setup_initramfs_file); |
| 929 | 935 | ||
| 930 | /* | 936 | /* |
| 931 | * We look for an additional "initramfs.cpio.gz" file in the hvfs. | 937 | * We look for an "initramfs.cpio.gz" file in the hvfs. |
| 932 | * If there is one, we allocate some memory for it and it will be | 938 | * If there is one, we allocate some memory for it and it will be |
| 933 | * unpacked to the initramfs after any built-in initramfs_data. | 939 | * unpacked to the initramfs. |
| 934 | */ | 940 | */ |
| 935 | static void __init load_hv_initrd(void) | 941 | static void __init load_hv_initrd(void) |
| 936 | { | 942 | { |
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index bc1eb586e24d..9efbc1391b3c 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c | |||
| @@ -153,6 +153,25 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
| 153 | if (((unsigned long)addr % size) == 0) | 153 | if (((unsigned long)addr % size) == 0) |
| 154 | return bundle; | 154 | return bundle; |
| 155 | 155 | ||
| 156 | /* | ||
| 157 | * Return SIGBUS with the unaligned address, if requested. | ||
| 158 | * Note that we return SIGBUS even for completely invalid addresses | ||
| 159 | * as long as they are in fact unaligned; this matches what the | ||
| 160 | * tilepro hardware would be doing, if it could provide us with the | ||
| 161 | * actual bad address in an SPR, which it doesn't. | ||
| 162 | */ | ||
| 163 | if (unaligned_fixup == 0) { | ||
| 164 | siginfo_t info = { | ||
| 165 | .si_signo = SIGBUS, | ||
| 166 | .si_code = BUS_ADRALN, | ||
| 167 | .si_addr = addr | ||
| 168 | }; | ||
| 169 | trace_unhandled_signal("unaligned trap", regs, | ||
| 170 | (unsigned long)addr, SIGBUS); | ||
| 171 | force_sig_info(info.si_signo, &info, current); | ||
| 172 | return (tilepro_bundle_bits) 0; | ||
| 173 | } | ||
| 174 | |||
| 156 | #ifndef __LITTLE_ENDIAN | 175 | #ifndef __LITTLE_ENDIAN |
| 157 | # error We assume little-endian representation with copy_xx_user size 2 here | 176 | # error We assume little-endian representation with copy_xx_user size 2 here |
| 158 | #endif | 177 | #endif |
| @@ -192,18 +211,6 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
| 192 | return (tile_bundle_bits) 0; | 211 | return (tile_bundle_bits) 0; |
| 193 | } | 212 | } |
| 194 | 213 | ||
| 195 | if (unaligned_fixup == 0) { | ||
| 196 | siginfo_t info = { | ||
| 197 | .si_signo = SIGBUS, | ||
| 198 | .si_code = BUS_ADRALN, | ||
| 199 | .si_addr = addr | ||
| 200 | }; | ||
| 201 | trace_unhandled_signal("unaligned trap", regs, | ||
| 202 | (unsigned long)addr, SIGBUS); | ||
| 203 | force_sig_info(info.si_signo, &info, current); | ||
| 204 | return (tile_bundle_bits) 0; | ||
| 205 | } | ||
| 206 | |||
| 207 | if (unaligned_printk || unaligned_fixup_count == 0) { | 214 | if (unaligned_printk || unaligned_fixup_count == 0) { |
| 208 | pr_info("Process %d/%s: PC %#lx: Fixup of" | 215 | pr_info("Process %d/%s: PC %#lx: Fixup of" |
| 209 | " unaligned %s at %#lx.\n", | 216 | " unaligned %s at %#lx.\n", |
diff --git a/arch/tile/kernel/smp.c b/arch/tile/kernel/smp.c index a44e103c5a63..91da0f721958 100644 --- a/arch/tile/kernel/smp.c +++ b/arch/tile/kernel/smp.c | |||
| @@ -103,7 +103,7 @@ static void smp_stop_cpu_interrupt(void) | |||
| 103 | set_cpu_online(smp_processor_id(), 0); | 103 | set_cpu_online(smp_processor_id(), 0); |
| 104 | arch_local_irq_disable_all(); | 104 | arch_local_irq_disable_all(); |
| 105 | for (;;) | 105 | for (;;) |
| 106 | asm("nap"); | 106 | asm("nap; nop"); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | /* This function calls the 'stop' function on all other CPUs in the system. */ | 109 | /* This function calls the 'stop' function on all other CPUs in the system. */ |
| @@ -113,6 +113,12 @@ void smp_send_stop(void) | |||
| 113 | send_IPI_allbutself(MSG_TAG_STOP_CPU); | 113 | send_IPI_allbutself(MSG_TAG_STOP_CPU); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | /* On panic, just wait; we may get an smp_send_stop() later on. */ | ||
| 117 | void panic_smp_self_stop(void) | ||
| 118 | { | ||
| 119 | while (1) | ||
| 120 | asm("nap; nop"); | ||
| 121 | } | ||
| 116 | 122 | ||
| 117 | /* | 123 | /* |
| 118 | * Dispatch code called from hv_message_intr() for HV_MSG_TILE hv messages. | 124 | * Dispatch code called from hv_message_intr() for HV_MSG_TILE hv messages. |
diff --git a/arch/tile/kernel/stack.c b/arch/tile/kernel/stack.c index 37ee4d037e0b..b2f44c28dda6 100644 --- a/arch/tile/kernel/stack.c +++ b/arch/tile/kernel/stack.c | |||
| @@ -21,10 +21,12 @@ | |||
| 21 | #include <linux/stacktrace.h> | 21 | #include <linux/stacktrace.h> |
| 22 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> |
| 23 | #include <linux/mmzone.h> | 23 | #include <linux/mmzone.h> |
| 24 | #include <linux/dcache.h> | ||
| 25 | #include <linux/fs.h> | ||
| 24 | #include <asm/backtrace.h> | 26 | #include <asm/backtrace.h> |
| 25 | #include <asm/page.h> | 27 | #include <asm/page.h> |
| 26 | #include <asm/tlbflush.h> | ||
| 27 | #include <asm/ucontext.h> | 28 | #include <asm/ucontext.h> |
| 29 | #include <asm/switch_to.h> | ||
| 28 | #include <asm/sigframe.h> | 30 | #include <asm/sigframe.h> |
| 29 | #include <asm/stack.h> | 31 | #include <asm/stack.h> |
| 30 | #include <arch/abi.h> | 32 | #include <arch/abi.h> |
| @@ -44,72 +46,23 @@ static int in_kernel_stack(struct KBacktraceIterator *kbt, unsigned long sp) | |||
| 44 | return sp >= kstack_base && sp < kstack_base + THREAD_SIZE; | 46 | return sp >= kstack_base && sp < kstack_base + THREAD_SIZE; |
| 45 | } | 47 | } |
| 46 | 48 | ||
| 47 | /* Is address valid for reading? */ | ||
| 48 | static int valid_address(struct KBacktraceIterator *kbt, unsigned long address) | ||
| 49 | { | ||
| 50 | HV_PTE *l1_pgtable = kbt->pgtable; | ||
| 51 | HV_PTE *l2_pgtable; | ||
| 52 | unsigned long pfn; | ||
| 53 | HV_PTE pte; | ||
| 54 | struct page *page; | ||
| 55 | |||
| 56 | if (l1_pgtable == NULL) | ||
| 57 | return 0; /* can't read user space in other tasks */ | ||
| 58 | |||
| 59 | #ifdef CONFIG_64BIT | ||
| 60 | /* Find the real l1_pgtable by looking in the l0_pgtable. */ | ||
| 61 | pte = l1_pgtable[HV_L0_INDEX(address)]; | ||
| 62 | if (!hv_pte_get_present(pte)) | ||
| 63 | return 0; | ||
| 64 | pfn = hv_pte_get_pfn(pte); | ||
| 65 | if (pte_huge(pte)) { | ||
| 66 | if (!pfn_valid(pfn)) { | ||
| 67 | pr_err("L0 huge page has bad pfn %#lx\n", pfn); | ||
| 68 | return 0; | ||
| 69 | } | ||
| 70 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
| 71 | } | ||
| 72 | page = pfn_to_page(pfn); | ||
| 73 | BUG_ON(PageHighMem(page)); /* No HIGHMEM on 64-bit. */ | ||
| 74 | l1_pgtable = (HV_PTE *)pfn_to_kaddr(pfn); | ||
| 75 | #endif | ||
| 76 | pte = l1_pgtable[HV_L1_INDEX(address)]; | ||
| 77 | if (!hv_pte_get_present(pte)) | ||
| 78 | return 0; | ||
| 79 | pfn = hv_pte_get_pfn(pte); | ||
| 80 | if (pte_huge(pte)) { | ||
| 81 | if (!pfn_valid(pfn)) { | ||
| 82 | pr_err("huge page has bad pfn %#lx\n", pfn); | ||
| 83 | return 0; | ||
| 84 | } | ||
| 85 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
| 86 | } | ||
| 87 | |||
| 88 | page = pfn_to_page(pfn); | ||
| 89 | if (PageHighMem(page)) { | ||
| 90 | pr_err("L2 page table not in LOWMEM (%#llx)\n", | ||
| 91 | HV_PFN_TO_CPA(pfn)); | ||
| 92 | return 0; | ||
| 93 | } | ||
| 94 | l2_pgtable = (HV_PTE *)pfn_to_kaddr(pfn); | ||
| 95 | pte = l2_pgtable[HV_L2_INDEX(address)]; | ||
| 96 | return hv_pte_get_present(pte) && hv_pte_get_readable(pte); | ||
| 97 | } | ||
| 98 | |||
| 99 | /* Callback for backtracer; basically a glorified memcpy */ | 49 | /* Callback for backtracer; basically a glorified memcpy */ |
| 100 | static bool read_memory_func(void *result, unsigned long address, | 50 | static bool read_memory_func(void *result, unsigned long address, |
| 101 | unsigned int size, void *vkbt) | 51 | unsigned int size, void *vkbt) |
| 102 | { | 52 | { |
| 103 | int retval; | 53 | int retval; |
| 104 | struct KBacktraceIterator *kbt = (struct KBacktraceIterator *)vkbt; | 54 | struct KBacktraceIterator *kbt = (struct KBacktraceIterator *)vkbt; |
| 55 | |||
| 56 | if (address == 0) | ||
| 57 | return 0; | ||
| 105 | if (__kernel_text_address(address)) { | 58 | if (__kernel_text_address(address)) { |
| 106 | /* OK to read kernel code. */ | 59 | /* OK to read kernel code. */ |
| 107 | } else if (address >= PAGE_OFFSET) { | 60 | } else if (address >= PAGE_OFFSET) { |
| 108 | /* We only tolerate kernel-space reads of this task's stack */ | 61 | /* We only tolerate kernel-space reads of this task's stack */ |
| 109 | if (!in_kernel_stack(kbt, address)) | 62 | if (!in_kernel_stack(kbt, address)) |
| 110 | return 0; | 63 | return 0; |
| 111 | } else if (!valid_address(kbt, address)) { | 64 | } else if (!kbt->is_current) { |
| 112 | return 0; /* invalid user-space address */ | 65 | return 0; /* can't read from other user address spaces */ |
| 113 | } | 66 | } |
| 114 | pagefault_disable(); | 67 | pagefault_disable(); |
| 115 | retval = __copy_from_user_inatomic(result, | 68 | retval = __copy_from_user_inatomic(result, |
| @@ -127,6 +80,8 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt) | |||
| 127 | unsigned long sp = kbt->it.sp; | 80 | unsigned long sp = kbt->it.sp; |
| 128 | struct pt_regs *p; | 81 | struct pt_regs *p; |
| 129 | 82 | ||
| 83 | if (sp % sizeof(long) != 0) | ||
| 84 | return NULL; | ||
| 130 | if (!in_kernel_stack(kbt, sp)) | 85 | if (!in_kernel_stack(kbt, sp)) |
| 131 | return NULL; | 86 | return NULL; |
| 132 | if (!in_kernel_stack(kbt, sp + C_ABI_SAVE_AREA_SIZE + PTREGS_SIZE-1)) | 87 | if (!in_kernel_stack(kbt, sp + C_ABI_SAVE_AREA_SIZE + PTREGS_SIZE-1)) |
| @@ -169,27 +124,27 @@ static int is_sigreturn(unsigned long pc) | |||
| 169 | } | 124 | } |
| 170 | 125 | ||
| 171 | /* Return a pt_regs pointer for a valid signal handler frame */ | 126 | /* Return a pt_regs pointer for a valid signal handler frame */ |
| 172 | static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt) | 127 | static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt, |
| 128 | struct rt_sigframe* kframe) | ||
| 173 | { | 129 | { |
| 174 | BacktraceIterator *b = &kbt->it; | 130 | BacktraceIterator *b = &kbt->it; |
| 175 | 131 | ||
| 176 | if (b->pc == VDSO_BASE) { | 132 | if (b->pc == VDSO_BASE && b->sp < PAGE_OFFSET && |
| 177 | struct rt_sigframe *frame; | 133 | b->sp % sizeof(long) == 0) { |
| 178 | unsigned long sigframe_top = | 134 | int retval; |
| 179 | b->sp + sizeof(struct rt_sigframe) - 1; | 135 | pagefault_disable(); |
| 180 | if (!valid_address(kbt, b->sp) || | 136 | retval = __copy_from_user_inatomic( |
| 181 | !valid_address(kbt, sigframe_top)) { | 137 | kframe, (void __user __force *)b->sp, |
| 182 | if (kbt->verbose) | 138 | sizeof(*kframe)); |
| 183 | pr_err(" (odd signal: sp %#lx?)\n", | 139 | pagefault_enable(); |
| 184 | (unsigned long)(b->sp)); | 140 | if (retval != 0 || |
| 141 | (unsigned int)(kframe->info.si_signo) >= _NSIG) | ||
| 185 | return NULL; | 142 | return NULL; |
| 186 | } | ||
| 187 | frame = (struct rt_sigframe *)b->sp; | ||
| 188 | if (kbt->verbose) { | 143 | if (kbt->verbose) { |
| 189 | pr_err(" <received signal %d>\n", | 144 | pr_err(" <received signal %d>\n", |
| 190 | frame->info.si_signo); | 145 | kframe->info.si_signo); |
| 191 | } | 146 | } |
| 192 | return (struct pt_regs *)&frame->uc.uc_mcontext; | 147 | return (struct pt_regs *)&kframe->uc.uc_mcontext; |
| 193 | } | 148 | } |
| 194 | return NULL; | 149 | return NULL; |
| 195 | } | 150 | } |
| @@ -202,10 +157,11 @@ static int KBacktraceIterator_is_sigreturn(struct KBacktraceIterator *kbt) | |||
| 202 | static int KBacktraceIterator_restart(struct KBacktraceIterator *kbt) | 157 | static int KBacktraceIterator_restart(struct KBacktraceIterator *kbt) |
| 203 | { | 158 | { |
| 204 | struct pt_regs *p; | 159 | struct pt_regs *p; |
| 160 | struct rt_sigframe kframe; | ||
| 205 | 161 | ||
| 206 | p = valid_fault_handler(kbt); | 162 | p = valid_fault_handler(kbt); |
| 207 | if (p == NULL) | 163 | if (p == NULL) |
| 208 | p = valid_sigframe(kbt); | 164 | p = valid_sigframe(kbt, &kframe); |
| 209 | if (p == NULL) | 165 | if (p == NULL) |
| 210 | return 0; | 166 | return 0; |
| 211 | backtrace_init(&kbt->it, read_memory_func, kbt, | 167 | backtrace_init(&kbt->it, read_memory_func, kbt, |
| @@ -265,41 +221,19 @@ void KBacktraceIterator_init(struct KBacktraceIterator *kbt, | |||
| 265 | 221 | ||
| 266 | /* | 222 | /* |
| 267 | * Set up callback information. We grab the kernel stack base | 223 | * Set up callback information. We grab the kernel stack base |
| 268 | * so we will allow reads of that address range, and if we're | 224 | * so we will allow reads of that address range. |
| 269 | * asking about the current process we grab the page table | ||
| 270 | * so we can check user accesses before trying to read them. | ||
| 271 | * We flush the TLB to avoid any weird skew issues. | ||
| 272 | */ | 225 | */ |
| 273 | is_current = (t == NULL); | 226 | is_current = (t == NULL || t == current); |
| 274 | kbt->is_current = is_current; | 227 | kbt->is_current = is_current; |
| 275 | if (is_current) | 228 | if (is_current) |
| 276 | t = validate_current(); | 229 | t = validate_current(); |
| 277 | kbt->task = t; | 230 | kbt->task = t; |
| 278 | kbt->pgtable = NULL; | ||
| 279 | kbt->verbose = 0; /* override in caller if desired */ | 231 | kbt->verbose = 0; /* override in caller if desired */ |
| 280 | kbt->profile = 0; /* override in caller if desired */ | 232 | kbt->profile = 0; /* override in caller if desired */ |
| 281 | kbt->end = KBT_ONGOING; | 233 | kbt->end = KBT_ONGOING; |
| 282 | kbt->new_context = 0; | 234 | kbt->new_context = 1; |
| 283 | if (is_current) { | 235 | if (is_current) |
| 284 | HV_PhysAddr pgdir_pa = hv_inquire_context().page_table; | ||
| 285 | if (pgdir_pa == (unsigned long)swapper_pg_dir - PAGE_OFFSET) { | ||
| 286 | /* | ||
| 287 | * Not just an optimization: this also allows | ||
| 288 | * this to work at all before va/pa mappings | ||
| 289 | * are set up. | ||
| 290 | */ | ||
| 291 | kbt->pgtable = swapper_pg_dir; | ||
| 292 | } else { | ||
| 293 | struct page *page = pfn_to_page(PFN_DOWN(pgdir_pa)); | ||
| 294 | if (!PageHighMem(page)) | ||
| 295 | kbt->pgtable = __va(pgdir_pa); | ||
| 296 | else | ||
| 297 | pr_err("page table not in LOWMEM" | ||
| 298 | " (%#llx)\n", pgdir_pa); | ||
| 299 | } | ||
| 300 | local_flush_tlb_all(); | ||
| 301 | validate_stack(regs); | 236 | validate_stack(regs); |
| 302 | } | ||
| 303 | 237 | ||
| 304 | if (regs == NULL) { | 238 | if (regs == NULL) { |
| 305 | if (is_current || t->state == TASK_RUNNING) { | 239 | if (is_current || t->state == TASK_RUNNING) { |
| @@ -345,6 +279,78 @@ void KBacktraceIterator_next(struct KBacktraceIterator *kbt) | |||
| 345 | } | 279 | } |
| 346 | EXPORT_SYMBOL(KBacktraceIterator_next); | 280 | EXPORT_SYMBOL(KBacktraceIterator_next); |
| 347 | 281 | ||
| 282 | static void describe_addr(struct KBacktraceIterator *kbt, | ||
| 283 | unsigned long address, | ||
| 284 | int have_mmap_sem, char *buf, size_t bufsize) | ||
| 285 | { | ||
| 286 | struct vm_area_struct *vma; | ||
| 287 | size_t namelen, remaining; | ||
| 288 | unsigned long size, offset, adjust; | ||
| 289 | char *p, *modname; | ||
| 290 | const char *name; | ||
| 291 | int rc; | ||
| 292 | |||
| 293 | /* | ||
| 294 | * Look one byte back for every caller frame (i.e. those that | ||
| 295 | * aren't a new context) so we look up symbol data for the | ||
| 296 | * call itself, not the following instruction, which may be on | ||
| 297 | * a different line (or in a different function). | ||
| 298 | */ | ||
| 299 | adjust = !kbt->new_context; | ||
| 300 | address -= adjust; | ||
| 301 | |||
| 302 | if (address >= PAGE_OFFSET) { | ||
| 303 | /* Handle kernel symbols. */ | ||
| 304 | BUG_ON(bufsize < KSYM_NAME_LEN); | ||
| 305 | name = kallsyms_lookup(address, &size, &offset, | ||
| 306 | &modname, buf); | ||
| 307 | if (name == NULL) { | ||
| 308 | buf[0] = '\0'; | ||
| 309 | return; | ||
| 310 | } | ||
| 311 | namelen = strlen(buf); | ||
| 312 | remaining = (bufsize - 1) - namelen; | ||
| 313 | p = buf + namelen; | ||
| 314 | rc = snprintf(p, remaining, "+%#lx/%#lx ", | ||
| 315 | offset + adjust, size); | ||
| 316 | if (modname && rc < remaining) | ||
| 317 | snprintf(p + rc, remaining - rc, "[%s] ", modname); | ||
| 318 | buf[bufsize-1] = '\0'; | ||
| 319 | return; | ||
| 320 | } | ||
| 321 | |||
| 322 | /* If we don't have the mmap_sem, we can't show any more info. */ | ||
| 323 | buf[0] = '\0'; | ||
| 324 | if (!have_mmap_sem) | ||
| 325 | return; | ||
| 326 | |||
| 327 | /* Find vma info. */ | ||
| 328 | vma = find_vma(kbt->task->mm, address); | ||
| 329 | if (vma == NULL || address < vma->vm_start) { | ||
| 330 | snprintf(buf, bufsize, "[unmapped address] "); | ||
| 331 | return; | ||
| 332 | } | ||
| 333 | |||
| 334 | if (vma->vm_file) { | ||
| 335 | char *s; | ||
| 336 | p = d_path(&vma->vm_file->f_path, buf, bufsize); | ||
| 337 | if (IS_ERR(p)) | ||
| 338 | p = "?"; | ||
| 339 | s = strrchr(p, '/'); | ||
| 340 | if (s) | ||
| 341 | p = s+1; | ||
| 342 | } else { | ||
| 343 | p = "anon"; | ||
| 344 | } | ||
| 345 | |||
| 346 | /* Generate a string description of the vma info. */ | ||
| 347 | namelen = strlen(p); | ||
| 348 | remaining = (bufsize - 1) - namelen; | ||
| 349 | memmove(buf, p, namelen); | ||
| 350 | snprintf(buf + namelen, remaining, "[%lx+%lx] ", | ||
| 351 | vma->vm_start, vma->vm_end - vma->vm_start); | ||
| 352 | } | ||
| 353 | |||
| 348 | /* | 354 | /* |
| 349 | * This method wraps the backtracer's more generic support. | 355 | * This method wraps the backtracer's more generic support. |
| 350 | * It is only invoked from the architecture-specific code; show_stack() | 356 | * It is only invoked from the architecture-specific code; show_stack() |
| @@ -353,6 +359,7 @@ EXPORT_SYMBOL(KBacktraceIterator_next); | |||
| 353 | void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | 359 | void tile_show_stack(struct KBacktraceIterator *kbt, int headers) |
| 354 | { | 360 | { |
| 355 | int i; | 361 | int i; |
| 362 | int have_mmap_sem = 0; | ||
| 356 | 363 | ||
| 357 | if (headers) { | 364 | if (headers) { |
| 358 | /* | 365 | /* |
| @@ -369,31 +376,16 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | |||
| 369 | kbt->verbose = 1; | 376 | kbt->verbose = 1; |
| 370 | i = 0; | 377 | i = 0; |
| 371 | for (; !KBacktraceIterator_end(kbt); KBacktraceIterator_next(kbt)) { | 378 | for (; !KBacktraceIterator_end(kbt); KBacktraceIterator_next(kbt)) { |
| 372 | char *modname; | ||
| 373 | const char *name; | ||
| 374 | unsigned long address = kbt->it.pc; | ||
| 375 | unsigned long offset, size; | ||
| 376 | char namebuf[KSYM_NAME_LEN+100]; | 379 | char namebuf[KSYM_NAME_LEN+100]; |
| 380 | unsigned long address = kbt->it.pc; | ||
| 377 | 381 | ||
| 378 | if (address >= PAGE_OFFSET) | 382 | /* Try to acquire the mmap_sem as we pass into userspace. */ |
| 379 | name = kallsyms_lookup(address, &size, &offset, | 383 | if (address < PAGE_OFFSET && !have_mmap_sem && kbt->task->mm) |
| 380 | &modname, namebuf); | 384 | have_mmap_sem = |
| 381 | else | 385 | down_read_trylock(&kbt->task->mm->mmap_sem); |
| 382 | name = NULL; | 386 | |
| 383 | 387 | describe_addr(kbt, address, have_mmap_sem, | |
| 384 | if (!name) | 388 | namebuf, sizeof(namebuf)); |
| 385 | namebuf[0] = '\0'; | ||
| 386 | else { | ||
| 387 | size_t namelen = strlen(namebuf); | ||
| 388 | size_t remaining = (sizeof(namebuf) - 1) - namelen; | ||
| 389 | char *p = namebuf + namelen; | ||
| 390 | int rc = snprintf(p, remaining, "+%#lx/%#lx ", | ||
| 391 | offset, size); | ||
| 392 | if (modname && rc < remaining) | ||
| 393 | snprintf(p + rc, remaining - rc, | ||
| 394 | "[%s] ", modname); | ||
| 395 | namebuf[sizeof(namebuf)-1] = '\0'; | ||
| 396 | } | ||
| 397 | 389 | ||
| 398 | pr_err(" frame %d: 0x%lx %s(sp 0x%lx)\n", | 390 | pr_err(" frame %d: 0x%lx %s(sp 0x%lx)\n", |
| 399 | i++, address, namebuf, (unsigned long)(kbt->it.sp)); | 391 | i++, address, namebuf, (unsigned long)(kbt->it.sp)); |
| @@ -408,6 +400,8 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers) | |||
| 408 | pr_err("Stack dump stopped; next frame identical to this one\n"); | 400 | pr_err("Stack dump stopped; next frame identical to this one\n"); |
| 409 | if (headers) | 401 | if (headers) |
| 410 | pr_err("Stack dump complete\n"); | 402 | pr_err("Stack dump complete\n"); |
| 403 | if (have_mmap_sem) | ||
| 404 | up_read(&kbt->task->mm->mmap_sem); | ||
| 411 | } | 405 | } |
| 412 | EXPORT_SYMBOL(tile_show_stack); | 406 | EXPORT_SYMBOL(tile_show_stack); |
| 413 | 407 | ||
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c index 2bb6602a1ee7..73cff814ac57 100644 --- a/arch/tile/kernel/traps.c +++ b/arch/tile/kernel/traps.c | |||
| @@ -200,7 +200,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
| 200 | { | 200 | { |
| 201 | siginfo_t info = { 0 }; | 201 | siginfo_t info = { 0 }; |
| 202 | int signo, code; | 202 | int signo, code; |
| 203 | unsigned long address; | 203 | unsigned long address = 0; |
| 204 | bundle_bits instr; | 204 | bundle_bits instr; |
| 205 | 205 | ||
| 206 | /* Re-enable interrupts. */ | 206 | /* Re-enable interrupts. */ |
| @@ -223,6 +223,10 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | switch (fault_num) { | 225 | switch (fault_num) { |
| 226 | case INT_MEM_ERROR: | ||
| 227 | signo = SIGBUS; | ||
| 228 | code = BUS_OBJERR; | ||
| 229 | break; | ||
| 226 | case INT_ILL: | 230 | case INT_ILL: |
| 227 | if (copy_from_user(&instr, (void __user *)regs->pc, | 231 | if (copy_from_user(&instr, (void __user *)regs->pc, |
| 228 | sizeof(instr))) { | 232 | sizeof(instr))) { |
| @@ -289,7 +293,10 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
| 289 | address = regs->pc; | 293 | address = regs->pc; |
| 290 | break; | 294 | break; |
| 291 | #ifdef __tilegx__ | 295 | #ifdef __tilegx__ |
| 292 | case INT_ILL_TRANS: | 296 | case INT_ILL_TRANS: { |
| 297 | /* Avoid a hardware erratum with the return address stack. */ | ||
| 298 | fill_ra_stack(); | ||
| 299 | |||
| 293 | signo = SIGSEGV; | 300 | signo = SIGSEGV; |
| 294 | code = SEGV_MAPERR; | 301 | code = SEGV_MAPERR; |
| 295 | if (reason & SPR_ILL_TRANS_REASON__I_STREAM_VA_RMASK) | 302 | if (reason & SPR_ILL_TRANS_REASON__I_STREAM_VA_RMASK) |
| @@ -297,6 +304,7 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
| 297 | else | 304 | else |
| 298 | address = 0; /* FIXME: GX: single-step for address */ | 305 | address = 0; /* FIXME: GX: single-step for address */ |
| 299 | break; | 306 | break; |
| 307 | } | ||
| 300 | #endif | 308 | #endif |
| 301 | default: | 309 | default: |
| 302 | panic("Unexpected do_trap interrupt number %d", fault_num); | 310 | panic("Unexpected do_trap interrupt number %d", fault_num); |
| @@ -308,7 +316,8 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num, | |||
| 308 | info.si_addr = (void __user *)address; | 316 | info.si_addr = (void __user *)address; |
| 309 | if (signo == SIGILL) | 317 | if (signo == SIGILL) |
| 310 | info.si_trapno = fault_num; | 318 | info.si_trapno = fault_num; |
| 311 | trace_unhandled_signal("trap", regs, address, signo); | 319 | if (signo != SIGTRAP) |
| 320 | trace_unhandled_signal("trap", regs, address, signo); | ||
| 312 | force_sig_info(signo, &info, current); | 321 | force_sig_info(signo, &info, current); |
| 313 | } | 322 | } |
| 314 | 323 | ||
diff --git a/arch/tile/lib/Makefile b/arch/tile/lib/Makefile index 0c26086ecbef..985f59858234 100644 --- a/arch/tile/lib/Makefile +++ b/arch/tile/lib/Makefile | |||
| @@ -7,6 +7,7 @@ lib-y = cacheflush.o checksum.o cpumask.o delay.o uaccess.o \ | |||
| 7 | strchr_$(BITS).o strlen_$(BITS).o | 7 | strchr_$(BITS).o strlen_$(BITS).o |
| 8 | 8 | ||
| 9 | ifeq ($(CONFIG_TILEGX),y) | 9 | ifeq ($(CONFIG_TILEGX),y) |
| 10 | CFLAGS_REMOVE_memcpy_user_64.o = -fno-omit-frame-pointer | ||
| 10 | lib-y += memcpy_user_64.o | 11 | lib-y += memcpy_user_64.o |
| 11 | else | 12 | else |
| 12 | lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o | 13 | lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o |
diff --git a/arch/tile/lib/cacheflush.c b/arch/tile/lib/cacheflush.c index 8928aace7a64..db4fb89e12d8 100644 --- a/arch/tile/lib/cacheflush.c +++ b/arch/tile/lib/cacheflush.c | |||
| @@ -39,7 +39,21 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
| 39 | { | 39 | { |
| 40 | char *p, *base; | 40 | char *p, *base; |
| 41 | size_t step_size, load_count; | 41 | size_t step_size, load_count; |
| 42 | |||
| 43 | /* | ||
| 44 | * On TILEPro the striping granularity is a fixed 8KB; on | ||
| 45 | * TILE-Gx it is configurable, and we rely on the fact that | ||
| 46 | * the hypervisor always configures maximum striping, so that | ||
| 47 | * bits 9 and 10 of the PA are part of the stripe function, so | ||
| 48 | * every 512 bytes we hit a striping boundary. | ||
| 49 | * | ||
| 50 | */ | ||
| 51 | #ifdef __tilegx__ | ||
| 52 | const unsigned long STRIPE_WIDTH = 512; | ||
| 53 | #else | ||
| 42 | const unsigned long STRIPE_WIDTH = 8192; | 54 | const unsigned long STRIPE_WIDTH = 8192; |
| 55 | #endif | ||
| 56 | |||
| 43 | #ifdef __tilegx__ | 57 | #ifdef __tilegx__ |
| 44 | /* | 58 | /* |
| 45 | * On TILE-Gx, we must disable the dstream prefetcher before doing | 59 | * On TILE-Gx, we must disable the dstream prefetcher before doing |
| @@ -74,7 +88,7 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
| 74 | * memory, that one load would be sufficient, but since we may | 88 | * memory, that one load would be sufficient, but since we may |
| 75 | * be, we also need to back up to the last load issued to | 89 | * be, we also need to back up to the last load issued to |
| 76 | * another memory controller, which would be the point where | 90 | * another memory controller, which would be the point where |
| 77 | * we crossed an 8KB boundary (the granularity of striping | 91 | * we crossed a "striping" boundary (the granularity of striping |
| 78 | * across memory controllers). Keep backing up and doing this | 92 | * across memory controllers). Keep backing up and doing this |
| 79 | * until we are before the beginning of the buffer, or have | 93 | * until we are before the beginning of the buffer, or have |
| 80 | * hit all the controllers. | 94 | * hit all the controllers. |
| @@ -88,12 +102,22 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
| 88 | * every cache line on a full memory stripe on each | 102 | * every cache line on a full memory stripe on each |
| 89 | * controller" that we simply do that, to simplify the logic. | 103 | * controller" that we simply do that, to simplify the logic. |
| 90 | * | 104 | * |
| 91 | * FIXME: See bug 9535 for some issues with this code. | 105 | * On TILE-Gx the hash-for-home function is much more complex, |
| 106 | * with the upshot being we can't readily guarantee we have | ||
| 107 | * hit both entries in the 128-entry AMT that were hit by any | ||
| 108 | * load in the entire range, so we just re-load them all. | ||
| 109 | * With larger buffers, we may want to consider using a hypervisor | ||
| 110 | * trap to issue loads directly to each hash-for-home tile for | ||
| 111 | * each controller (doing it from Linux would trash the TLB). | ||
| 92 | */ | 112 | */ |
| 93 | if (hfh) { | 113 | if (hfh) { |
| 94 | step_size = L2_CACHE_BYTES; | 114 | step_size = L2_CACHE_BYTES; |
| 115 | #ifdef __tilegx__ | ||
| 116 | load_count = (size + L2_CACHE_BYTES - 1) / L2_CACHE_BYTES; | ||
| 117 | #else | ||
| 95 | load_count = (STRIPE_WIDTH / L2_CACHE_BYTES) * | 118 | load_count = (STRIPE_WIDTH / L2_CACHE_BYTES) * |
| 96 | (1 << CHIP_LOG_NUM_MSHIMS()); | 119 | (1 << CHIP_LOG_NUM_MSHIMS()); |
| 120 | #endif | ||
| 97 | } else { | 121 | } else { |
| 98 | step_size = STRIPE_WIDTH; | 122 | step_size = STRIPE_WIDTH; |
| 99 | load_count = (1 << CHIP_LOG_NUM_MSHIMS()); | 123 | load_count = (1 << CHIP_LOG_NUM_MSHIMS()); |
| @@ -109,7 +133,7 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh) | |||
| 109 | 133 | ||
| 110 | /* Figure out how far back we need to go. */ | 134 | /* Figure out how far back we need to go. */ |
| 111 | base = p - (step_size * (load_count - 2)); | 135 | base = p - (step_size * (load_count - 2)); |
| 112 | if ((long)base < (long)buffer) | 136 | if ((unsigned long)base < (unsigned long)buffer) |
| 113 | base = buffer; | 137 | base = buffer; |
| 114 | 138 | ||
| 115 | /* | 139 | /* |
diff --git a/arch/tile/lib/memcpy_user_64.c b/arch/tile/lib/memcpy_user_64.c index 4763b3aff1cc..37440caa7370 100644 --- a/arch/tile/lib/memcpy_user_64.c +++ b/arch/tile/lib/memcpy_user_64.c | |||
| @@ -14,7 +14,13 @@ | |||
| 14 | * Do memcpy(), but trap and return "n" when a load or store faults. | 14 | * Do memcpy(), but trap and return "n" when a load or store faults. |
| 15 | * | 15 | * |
| 16 | * Note: this idiom only works when memcpy() compiles to a leaf function. | 16 | * Note: this idiom only works when memcpy() compiles to a leaf function. |
| 17 | * If "sp" is updated during memcpy, the "jrp lr" will be incorrect. | 17 | * Here leaf function not only means it does not have calls, but also |
| 18 | * requires no stack operations (sp, stack frame pointer) and no | ||
| 19 | * use of callee-saved registers, else "jrp lr" will be incorrect since | ||
| 20 | * unwinding stack frame is bypassed. Since memcpy() is not complex so | ||
| 21 | * these conditions are satisfied here, but we need to be careful when | ||
| 22 | * modifying this file. This is not a clean solution but is the best | ||
| 23 | * one so far. | ||
| 18 | * | 24 | * |
| 19 | * Also note that we are capturing "n" from the containing scope here. | 25 | * Also note that we are capturing "n" from the containing scope here. |
| 20 | */ | 26 | */ |
diff --git a/arch/tile/lib/spinlock_common.h b/arch/tile/lib/spinlock_common.h index c10109809132..6ac37509faca 100644 --- a/arch/tile/lib/spinlock_common.h +++ b/arch/tile/lib/spinlock_common.h | |||
| @@ -60,5 +60,5 @@ static void delay_backoff(int iterations) | |||
| 60 | loops += __insn_crc32_32(stack_pointer, get_cycles_low()) & | 60 | loops += __insn_crc32_32(stack_pointer, get_cycles_low()) & |
| 61 | (loops - 1); | 61 | (loops - 1); |
| 62 | 62 | ||
| 63 | relax(1 << exponent); | 63 | relax(loops); |
| 64 | } | 64 | } |
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index cba30e9547b4..22e58f51ed23 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c | |||
| @@ -130,7 +130,7 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | |||
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | /* | 132 | /* |
| 133 | * Handle a fault on the vmalloc or module mapping area | 133 | * Handle a fault on the vmalloc area. |
| 134 | */ | 134 | */ |
| 135 | static inline int vmalloc_fault(pgd_t *pgd, unsigned long address) | 135 | static inline int vmalloc_fault(pgd_t *pgd, unsigned long address) |
| 136 | { | 136 | { |
| @@ -203,9 +203,14 @@ static pgd_t *get_current_pgd(void) | |||
| 203 | * interrupt or a critical region, and must do as little as possible. | 203 | * interrupt or a critical region, and must do as little as possible. |
| 204 | * Similarly, we can't use atomic ops here, since we may be handling a | 204 | * Similarly, we can't use atomic ops here, since we may be handling a |
| 205 | * fault caused by an atomic op access. | 205 | * fault caused by an atomic op access. |
| 206 | * | ||
| 207 | * If we find a migrating PTE while we're in an NMI context, and we're | ||
| 208 | * at a PC that has a registered exception handler, we don't wait, | ||
| 209 | * since this thread may (e.g.) have been interrupted while migrating | ||
| 210 | * its own stack, which would then cause us to self-deadlock. | ||
| 206 | */ | 211 | */ |
| 207 | static int handle_migrating_pte(pgd_t *pgd, int fault_num, | 212 | static int handle_migrating_pte(pgd_t *pgd, int fault_num, |
| 208 | unsigned long address, | 213 | unsigned long address, unsigned long pc, |
| 209 | int is_kernel_mode, int write) | 214 | int is_kernel_mode, int write) |
| 210 | { | 215 | { |
| 211 | pud_t *pud; | 216 | pud_t *pud; |
| @@ -227,6 +232,8 @@ static int handle_migrating_pte(pgd_t *pgd, int fault_num, | |||
| 227 | pte_offset_kernel(pmd, address); | 232 | pte_offset_kernel(pmd, address); |
| 228 | pteval = *pte; | 233 | pteval = *pte; |
| 229 | if (pte_migrating(pteval)) { | 234 | if (pte_migrating(pteval)) { |
| 235 | if (in_nmi() && search_exception_tables(pc)) | ||
| 236 | return 0; | ||
| 230 | wait_for_migration(pte); | 237 | wait_for_migration(pte); |
| 231 | return 1; | 238 | return 1; |
| 232 | } | 239 | } |
| @@ -300,7 +307,7 @@ static int handle_page_fault(struct pt_regs *regs, | |||
| 300 | * rather than trying to patch up the existing PTE. | 307 | * rather than trying to patch up the existing PTE. |
| 301 | */ | 308 | */ |
| 302 | pgd = get_current_pgd(); | 309 | pgd = get_current_pgd(); |
| 303 | if (handle_migrating_pte(pgd, fault_num, address, | 310 | if (handle_migrating_pte(pgd, fault_num, address, regs->pc, |
| 304 | is_kernel_mode, write)) | 311 | is_kernel_mode, write)) |
| 305 | return 1; | 312 | return 1; |
| 306 | 313 | ||
| @@ -335,9 +342,12 @@ static int handle_page_fault(struct pt_regs *regs, | |||
| 335 | /* | 342 | /* |
| 336 | * If we're trying to touch user-space addresses, we must | 343 | * If we're trying to touch user-space addresses, we must |
| 337 | * be either at PL0, or else with interrupts enabled in the | 344 | * be either at PL0, or else with interrupts enabled in the |
| 338 | * kernel, so either way we can re-enable interrupts here. | 345 | * kernel, so either way we can re-enable interrupts here |
| 346 | * unless we are doing atomic access to user space with | ||
| 347 | * interrupts disabled. | ||
| 339 | */ | 348 | */ |
| 340 | local_irq_enable(); | 349 | if (!(regs->flags & PT_FLAGS_DISABLE_IRQ)) |
| 350 | local_irq_enable(); | ||
| 341 | 351 | ||
| 342 | mm = tsk->mm; | 352 | mm = tsk->mm; |
| 343 | 353 | ||
| @@ -665,7 +675,7 @@ struct intvec_state do_page_fault_ics(struct pt_regs *regs, int fault_num, | |||
| 665 | */ | 675 | */ |
| 666 | if (fault_num == INT_DTLB_ACCESS) | 676 | if (fault_num == INT_DTLB_ACCESS) |
| 667 | write = 1; | 677 | write = 1; |
| 668 | if (handle_migrating_pte(pgd, fault_num, address, 1, write)) | 678 | if (handle_migrating_pte(pgd, fault_num, address, pc, 1, write)) |
| 669 | return state; | 679 | return state; |
| 670 | 680 | ||
| 671 | /* Return zero so that we continue on with normal fault handling. */ | 681 | /* Return zero so that we continue on with normal fault handling. */ |
diff --git a/arch/tile/mm/homecache.c b/arch/tile/mm/homecache.c index 1cc6ae477c98..499f73770b05 100644 --- a/arch/tile/mm/homecache.c +++ b/arch/tile/mm/homecache.c | |||
| @@ -394,6 +394,7 @@ int page_home(struct page *page) | |||
| 394 | return pte_to_home(*virt_to_pte(NULL, kva)); | 394 | return pte_to_home(*virt_to_pte(NULL, kva)); |
| 395 | } | 395 | } |
| 396 | } | 396 | } |
| 397 | EXPORT_SYMBOL(page_home); | ||
| 397 | 398 | ||
| 398 | void homecache_change_page_home(struct page *page, int order, int home) | 399 | void homecache_change_page_home(struct page *page, int order, int home) |
| 399 | { | 400 | { |
diff --git a/arch/tile/mm/init.c b/arch/tile/mm/init.c index 830c4908ea76..6a9d20ddc34f 100644 --- a/arch/tile/mm/init.c +++ b/arch/tile/mm/init.c | |||
| @@ -254,11 +254,6 @@ static pgprot_t __init init_pgprot(ulong address) | |||
| 254 | return construct_pgprot(PAGE_KERNEL_RO, PAGE_HOME_IMMUTABLE); | 254 | return construct_pgprot(PAGE_KERNEL_RO, PAGE_HOME_IMMUTABLE); |
| 255 | } | 255 | } |
| 256 | 256 | ||
| 257 | /* As a performance optimization, keep the boot init stack here. */ | ||
| 258 | if (address >= (ulong)&init_thread_union && | ||
| 259 | address < (ulong)&init_thread_union + THREAD_SIZE) | ||
| 260 | return construct_pgprot(PAGE_KERNEL, smp_processor_id()); | ||
| 261 | |||
| 262 | #ifndef __tilegx__ | 257 | #ifndef __tilegx__ |
| 263 | #if !ATOMIC_LOCKS_FOUND_VIA_TABLE() | 258 | #if !ATOMIC_LOCKS_FOUND_VIA_TABLE() |
| 264 | /* Force the atomic_locks[] array page to be hash-for-home. */ | 259 | /* Force the atomic_locks[] array page to be hash-for-home. */ |
| @@ -557,6 +552,7 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
| 557 | 552 | ||
| 558 | address = MEM_SV_INTRPT; | 553 | address = MEM_SV_INTRPT; |
| 559 | pmd = get_pmd(pgtables, address); | 554 | pmd = get_pmd(pgtables, address); |
| 555 | pfn = 0; /* code starts at PA 0 */ | ||
| 560 | if (ktext_small) { | 556 | if (ktext_small) { |
| 561 | /* Allocate an L2 PTE for the kernel text */ | 557 | /* Allocate an L2 PTE for the kernel text */ |
| 562 | int cpu = 0; | 558 | int cpu = 0; |
| @@ -579,10 +575,15 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
| 579 | } | 575 | } |
| 580 | 576 | ||
| 581 | BUG_ON(address != (unsigned long)_stext); | 577 | BUG_ON(address != (unsigned long)_stext); |
| 582 | pfn = 0; /* code starts at PA 0 */ | 578 | pte = NULL; |
| 583 | pte = alloc_pte(); | 579 | for (; address < (unsigned long)_einittext; |
| 584 | for (pte_ofs = 0; address < (unsigned long)_einittext; | 580 | pfn++, address += PAGE_SIZE) { |
| 585 | pfn++, pte_ofs++, address += PAGE_SIZE) { | 581 | pte_ofs = pte_index(address); |
| 582 | if (pte_ofs == 0) { | ||
| 583 | if (pte) | ||
| 584 | assign_pte(pmd++, pte); | ||
| 585 | pte = alloc_pte(); | ||
| 586 | } | ||
| 586 | if (!ktext_local) { | 587 | if (!ktext_local) { |
| 587 | prot = set_remote_cache_cpu(prot, cpu); | 588 | prot = set_remote_cache_cpu(prot, cpu); |
| 588 | cpu = cpumask_next(cpu, &ktext_mask); | 589 | cpu = cpumask_next(cpu, &ktext_mask); |
| @@ -591,7 +592,8 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
| 591 | } | 592 | } |
| 592 | pte[pte_ofs] = pfn_pte(pfn, prot); | 593 | pte[pte_ofs] = pfn_pte(pfn, prot); |
| 593 | } | 594 | } |
| 594 | assign_pte(pmd, pte); | 595 | if (pte) |
| 596 | assign_pte(pmd, pte); | ||
| 595 | } else { | 597 | } else { |
| 596 | pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC); | 598 | pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC); |
| 597 | pteval = pte_mkhuge(pteval); | 599 | pteval = pte_mkhuge(pteval); |
| @@ -614,7 +616,9 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
| 614 | else | 616 | else |
| 615 | pteval = hv_pte_set_mode(pteval, | 617 | pteval = hv_pte_set_mode(pteval, |
| 616 | HV_PTE_MODE_CACHE_NO_L3); | 618 | HV_PTE_MODE_CACHE_NO_L3); |
| 617 | *(pte_t *)pmd = pteval; | 619 | for (; address < (unsigned long)_einittext; |
| 620 | pfn += PFN_DOWN(HPAGE_SIZE), address += HPAGE_SIZE) | ||
| 621 | *(pte_t *)(pmd++) = pfn_pte(pfn, pteval); | ||
| 618 | } | 622 | } |
| 619 | 623 | ||
| 620 | /* Set swapper_pgprot here so it is flushed to memory right away. */ | 624 | /* Set swapper_pgprot here so it is flushed to memory right away. */ |
diff --git a/arch/tile/mm/pgtable.c b/arch/tile/mm/pgtable.c index 87303693a072..2410aa899b3e 100644 --- a/arch/tile/mm/pgtable.c +++ b/arch/tile/mm/pgtable.c | |||
| @@ -177,14 +177,10 @@ void shatter_huge_page(unsigned long addr) | |||
| 177 | if (!pmd_huge_page(*pmd)) | 177 | if (!pmd_huge_page(*pmd)) |
| 178 | return; | 178 | return; |
| 179 | 179 | ||
| 180 | /* | 180 | spin_lock_irqsave(&init_mm.page_table_lock, flags); |
| 181 | * Grab the pgd_lock, since we may need it to walk the pgd_list, | ||
| 182 | * and since we need some kind of lock here to avoid races. | ||
| 183 | */ | ||
| 184 | spin_lock_irqsave(&pgd_lock, flags); | ||
| 185 | if (!pmd_huge_page(*pmd)) { | 181 | if (!pmd_huge_page(*pmd)) { |
| 186 | /* Lost the race to convert the huge page. */ | 182 | /* Lost the race to convert the huge page. */ |
| 187 | spin_unlock_irqrestore(&pgd_lock, flags); | 183 | spin_unlock_irqrestore(&init_mm.page_table_lock, flags); |
| 188 | return; | 184 | return; |
| 189 | } | 185 | } |
| 190 | 186 | ||
| @@ -194,6 +190,7 @@ void shatter_huge_page(unsigned long addr) | |||
| 194 | 190 | ||
| 195 | #ifdef __PAGETABLE_PMD_FOLDED | 191 | #ifdef __PAGETABLE_PMD_FOLDED |
| 196 | /* Walk every pgd on the system and update the pmd there. */ | 192 | /* Walk every pgd on the system and update the pmd there. */ |
| 193 | spin_lock(&pgd_lock); | ||
| 197 | list_for_each(pos, &pgd_list) { | 194 | list_for_each(pos, &pgd_list) { |
| 198 | pmd_t *copy_pmd; | 195 | pmd_t *copy_pmd; |
| 199 | pgd = list_to_pgd(pos) + pgd_index(addr); | 196 | pgd = list_to_pgd(pos) + pgd_index(addr); |
| @@ -201,6 +198,7 @@ void shatter_huge_page(unsigned long addr) | |||
| 201 | copy_pmd = pmd_offset(pud, addr); | 198 | copy_pmd = pmd_offset(pud, addr); |
| 202 | __set_pmd(copy_pmd, *pmd); | 199 | __set_pmd(copy_pmd, *pmd); |
| 203 | } | 200 | } |
| 201 | spin_unlock(&pgd_lock); | ||
| 204 | #endif | 202 | #endif |
| 205 | 203 | ||
| 206 | /* Tell every cpu to notice the change. */ | 204 | /* Tell every cpu to notice the change. */ |
| @@ -208,7 +206,7 @@ void shatter_huge_page(unsigned long addr) | |||
| 208 | cpu_possible_mask, NULL, 0); | 206 | cpu_possible_mask, NULL, 0); |
| 209 | 207 | ||
| 210 | /* Hold the lock until the TLB flush is finished to avoid races. */ | 208 | /* Hold the lock until the TLB flush is finished to avoid races. */ |
| 211 | spin_unlock_irqrestore(&pgd_lock, flags); | 209 | spin_unlock_irqrestore(&init_mm.page_table_lock, flags); |
| 212 | } | 210 | } |
| 213 | 211 | ||
| 214 | /* | 212 | /* |
| @@ -217,9 +215,13 @@ void shatter_huge_page(unsigned long addr) | |||
| 217 | * against pageattr.c; it is the unique case in which a valid change | 215 | * against pageattr.c; it is the unique case in which a valid change |
| 218 | * of kernel pagetables can't be lazily synchronized by vmalloc faults. | 216 | * of kernel pagetables can't be lazily synchronized by vmalloc faults. |
| 219 | * vmalloc faults work because attached pagetables are never freed. | 217 | * vmalloc faults work because attached pagetables are never freed. |
| 220 | * The locking scheme was chosen on the basis of manfred's | 218 | * |
| 221 | * recommendations and having no core impact whatsoever. | 219 | * The lock is always taken with interrupts disabled, unlike on x86 |
| 222 | * -- wli | 220 | * and other platforms, because we need to take the lock in |
| 221 | * shatter_huge_page(), which may be called from an interrupt context. | ||
| 222 | * We are not at risk from the tlbflush IPI deadlock that was seen on | ||
| 223 | * x86, since we use the flush_remote() API to have the hypervisor do | ||
| 224 | * the TLB flushes regardless of irq disabling. | ||
| 223 | */ | 225 | */ |
| 224 | DEFINE_SPINLOCK(pgd_lock); | 226 | DEFINE_SPINLOCK(pgd_lock); |
| 225 | LIST_HEAD(pgd_list); | 227 | LIST_HEAD(pgd_list); |
| @@ -469,10 +471,18 @@ void __set_pte(pte_t *ptep, pte_t pte) | |||
| 469 | 471 | ||
| 470 | void set_pte(pte_t *ptep, pte_t pte) | 472 | void set_pte(pte_t *ptep, pte_t pte) |
| 471 | { | 473 | { |
| 472 | struct page *page = pfn_to_page(pte_pfn(pte)); | 474 | if (pte_present(pte) && |
| 473 | 475 | (!CHIP_HAS_MMIO() || hv_pte_get_mode(pte) != HV_PTE_MODE_MMIO)) { | |
| 474 | /* Update the home of a PTE if necessary */ | 476 | /* The PTE actually references physical memory. */ |
| 475 | pte = pte_set_home(pte, page_home(page)); | 477 | unsigned long pfn = pte_pfn(pte); |
| 478 | if (pfn_valid(pfn)) { | ||
| 479 | /* Update the home of the PTE from the struct page. */ | ||
| 480 | pte = pte_set_home(pte, page_home(pfn_to_page(pfn))); | ||
| 481 | } else if (hv_pte_get_mode(pte) == 0) { | ||
| 482 | /* remap_pfn_range(), etc, must supply PTE mode. */ | ||
| 483 | panic("set_pte(): out-of-range PFN and mode 0\n"); | ||
| 484 | } | ||
| 485 | } | ||
| 476 | 486 | ||
| 477 | __set_pte(ptep, pte); | 487 | __set_pte(ptep, pte); |
| 478 | } | 488 | } |
diff --git a/arch/x86/include/asm/word-at-a-time.h b/arch/x86/include/asm/word-at-a-time.h new file mode 100644 index 000000000000..6fe6767b7124 --- /dev/null +++ b/arch/x86/include/asm/word-at-a-time.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #ifndef _ASM_WORD_AT_A_TIME_H | ||
| 2 | #define _ASM_WORD_AT_A_TIME_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * This is largely generic for little-endian machines, but the | ||
| 6 | * optimal byte mask counting is probably going to be something | ||
| 7 | * that is architecture-specific. If you have a reliably fast | ||
| 8 | * bit count instruction, that might be better than the multiply | ||
| 9 | * and shift, for example. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #ifdef CONFIG_64BIT | ||
| 13 | |||
| 14 | /* | ||
| 15 | * Jan Achrenius on G+: microoptimized version of | ||
| 16 | * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" | ||
| 17 | * that works for the bytemasks without having to | ||
| 18 | * mask them first. | ||
| 19 | */ | ||
| 20 | static inline long count_masked_bytes(unsigned long mask) | ||
| 21 | { | ||
| 22 | return mask*0x0001020304050608ul >> 56; | ||
| 23 | } | ||
| 24 | |||
| 25 | #else /* 32-bit case */ | ||
| 26 | |||
| 27 | /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ | ||
| 28 | static inline long count_masked_bytes(long mask) | ||
| 29 | { | ||
| 30 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
| 31 | long a = (0x0ff0001+mask) >> 23; | ||
| 32 | /* Fix the 1 for 00 case */ | ||
| 33 | return a & mask; | ||
| 34 | } | ||
| 35 | |||
| 36 | #endif | ||
| 37 | |||
| 38 | #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) | ||
| 39 | |||
| 40 | /* Return the high bit set in the first byte that is a zero */ | ||
| 41 | static inline unsigned long has_zero(unsigned long a) | ||
| 42 | { | ||
| 43 | return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80); | ||
| 44 | } | ||
| 45 | |||
| 46 | #endif /* _ASM_WORD_AT_A_TIME_H */ | ||
diff --git a/arch/x86/kernel/kdebugfs.c b/arch/x86/kernel/kdebugfs.c index 90fcf62854bb..1d5d31ea686b 100644 --- a/arch/x86/kernel/kdebugfs.c +++ b/arch/x86/kernel/kdebugfs.c | |||
| @@ -68,16 +68,9 @@ static ssize_t setup_data_read(struct file *file, char __user *user_buf, | |||
| 68 | return count; | 68 | return count; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static int setup_data_open(struct inode *inode, struct file *file) | ||
| 72 | { | ||
| 73 | file->private_data = inode->i_private; | ||
| 74 | |||
| 75 | return 0; | ||
| 76 | } | ||
| 77 | |||
| 78 | static const struct file_operations fops_setup_data = { | 71 | static const struct file_operations fops_setup_data = { |
| 79 | .read = setup_data_read, | 72 | .read = setup_data_read, |
| 80 | .open = setup_data_open, | 73 | .open = simple_open, |
| 81 | .llseek = default_llseek, | 74 | .llseek = default_llseek, |
| 82 | }; | 75 | }; |
| 83 | 76 | ||
diff --git a/arch/x86/net/bpf_jit.S b/arch/x86/net/bpf_jit.S index 66870223f8c5..877b9a1b2152 100644 --- a/arch/x86/net/bpf_jit.S +++ b/arch/x86/net/bpf_jit.S | |||
| @@ -18,17 +18,17 @@ | |||
| 18 | * r9d : hlen = skb->len - skb->data_len | 18 | * r9d : hlen = skb->len - skb->data_len |
| 19 | */ | 19 | */ |
| 20 | #define SKBDATA %r8 | 20 | #define SKBDATA %r8 |
| 21 | 21 | #define SKF_MAX_NEG_OFF $(-0x200000) /* SKF_LL_OFF from filter.h */ | |
| 22 | sk_load_word_ind: | ||
| 23 | .globl sk_load_word_ind | ||
| 24 | |||
| 25 | add %ebx,%esi /* offset += X */ | ||
| 26 | # test %esi,%esi /* if (offset < 0) goto bpf_error; */ | ||
| 27 | js bpf_error | ||
| 28 | 22 | ||
| 29 | sk_load_word: | 23 | sk_load_word: |
| 30 | .globl sk_load_word | 24 | .globl sk_load_word |
| 31 | 25 | ||
| 26 | test %esi,%esi | ||
| 27 | js bpf_slow_path_word_neg | ||
| 28 | |||
| 29 | sk_load_word_positive_offset: | ||
| 30 | .globl sk_load_word_positive_offset | ||
| 31 | |||
| 32 | mov %r9d,%eax # hlen | 32 | mov %r9d,%eax # hlen |
| 33 | sub %esi,%eax # hlen - offset | 33 | sub %esi,%eax # hlen - offset |
| 34 | cmp $3,%eax | 34 | cmp $3,%eax |
| @@ -37,16 +37,15 @@ sk_load_word: | |||
| 37 | bswap %eax /* ntohl() */ | 37 | bswap %eax /* ntohl() */ |
| 38 | ret | 38 | ret |
| 39 | 39 | ||
| 40 | |||
| 41 | sk_load_half_ind: | ||
| 42 | .globl sk_load_half_ind | ||
| 43 | |||
| 44 | add %ebx,%esi /* offset += X */ | ||
| 45 | js bpf_error | ||
| 46 | |||
| 47 | sk_load_half: | 40 | sk_load_half: |
| 48 | .globl sk_load_half | 41 | .globl sk_load_half |
| 49 | 42 | ||
| 43 | test %esi,%esi | ||
| 44 | js bpf_slow_path_half_neg | ||
| 45 | |||
| 46 | sk_load_half_positive_offset: | ||
| 47 | .globl sk_load_half_positive_offset | ||
| 48 | |||
| 50 | mov %r9d,%eax | 49 | mov %r9d,%eax |
| 51 | sub %esi,%eax # hlen - offset | 50 | sub %esi,%eax # hlen - offset |
| 52 | cmp $1,%eax | 51 | cmp $1,%eax |
| @@ -55,14 +54,15 @@ sk_load_half: | |||
| 55 | rol $8,%ax # ntohs() | 54 | rol $8,%ax # ntohs() |
| 56 | ret | 55 | ret |
| 57 | 56 | ||
| 58 | sk_load_byte_ind: | ||
| 59 | .globl sk_load_byte_ind | ||
| 60 | add %ebx,%esi /* offset += X */ | ||
| 61 | js bpf_error | ||
| 62 | |||
| 63 | sk_load_byte: | 57 | sk_load_byte: |
| 64 | .globl sk_load_byte | 58 | .globl sk_load_byte |
| 65 | 59 | ||
| 60 | test %esi,%esi | ||
| 61 | js bpf_slow_path_byte_neg | ||
| 62 | |||
| 63 | sk_load_byte_positive_offset: | ||
| 64 | .globl sk_load_byte_positive_offset | ||
| 65 | |||
| 66 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ | 66 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte */ |
| 67 | jle bpf_slow_path_byte | 67 | jle bpf_slow_path_byte |
| 68 | movzbl (SKBDATA,%rsi),%eax | 68 | movzbl (SKBDATA,%rsi),%eax |
| @@ -73,25 +73,21 @@ sk_load_byte: | |||
| 73 | * | 73 | * |
| 74 | * Implements BPF_S_LDX_B_MSH : ldxb 4*([offset]&0xf) | 74 | * Implements BPF_S_LDX_B_MSH : ldxb 4*([offset]&0xf) |
| 75 | * Must preserve A accumulator (%eax) | 75 | * Must preserve A accumulator (%eax) |
| 76 | * Inputs : %esi is the offset value, already known positive | 76 | * Inputs : %esi is the offset value |
| 77 | */ | 77 | */ |
| 78 | ENTRY(sk_load_byte_msh) | 78 | sk_load_byte_msh: |
| 79 | CFI_STARTPROC | 79 | .globl sk_load_byte_msh |
| 80 | test %esi,%esi | ||
| 81 | js bpf_slow_path_byte_msh_neg | ||
| 82 | |||
| 83 | sk_load_byte_msh_positive_offset: | ||
| 84 | .globl sk_load_byte_msh_positive_offset | ||
| 80 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte_msh */ | 85 | cmp %esi,%r9d /* if (offset >= hlen) goto bpf_slow_path_byte_msh */ |
| 81 | jle bpf_slow_path_byte_msh | 86 | jle bpf_slow_path_byte_msh |
| 82 | movzbl (SKBDATA,%rsi),%ebx | 87 | movzbl (SKBDATA,%rsi),%ebx |
| 83 | and $15,%bl | 88 | and $15,%bl |
| 84 | shl $2,%bl | 89 | shl $2,%bl |
| 85 | ret | 90 | ret |
| 86 | CFI_ENDPROC | ||
| 87 | ENDPROC(sk_load_byte_msh) | ||
| 88 | |||
| 89 | bpf_error: | ||
| 90 | # force a return 0 from jit handler | ||
| 91 | xor %eax,%eax | ||
| 92 | mov -8(%rbp),%rbx | ||
| 93 | leaveq | ||
| 94 | ret | ||
| 95 | 91 | ||
| 96 | /* rsi contains offset and can be scratched */ | 92 | /* rsi contains offset and can be scratched */ |
| 97 | #define bpf_slow_path_common(LEN) \ | 93 | #define bpf_slow_path_common(LEN) \ |
| @@ -138,3 +134,67 @@ bpf_slow_path_byte_msh: | |||
| 138 | shl $2,%al | 134 | shl $2,%al |
| 139 | xchg %eax,%ebx | 135 | xchg %eax,%ebx |
| 140 | ret | 136 | ret |
| 137 | |||
| 138 | #define sk_negative_common(SIZE) \ | ||
| 139 | push %rdi; /* save skb */ \ | ||
| 140 | push %r9; \ | ||
| 141 | push SKBDATA; \ | ||
| 142 | /* rsi already has offset */ \ | ||
| 143 | mov $SIZE,%ecx; /* size */ \ | ||
| 144 | call bpf_internal_load_pointer_neg_helper; \ | ||
| 145 | test %rax,%rax; \ | ||
| 146 | pop SKBDATA; \ | ||
| 147 | pop %r9; \ | ||
| 148 | pop %rdi; \ | ||
| 149 | jz bpf_error | ||
| 150 | |||
| 151 | |||
| 152 | bpf_slow_path_word_neg: | ||
| 153 | cmp SKF_MAX_NEG_OFF, %esi /* test range */ | ||
| 154 | jl bpf_error /* offset lower -> error */ | ||
| 155 | sk_load_word_negative_offset: | ||
| 156 | .globl sk_load_word_negative_offset | ||
| 157 | sk_negative_common(4) | ||
| 158 | mov (%rax), %eax | ||
| 159 | bswap %eax | ||
| 160 | ret | ||
| 161 | |||
| 162 | bpf_slow_path_half_neg: | ||
| 163 | cmp SKF_MAX_NEG_OFF, %esi | ||
| 164 | jl bpf_error | ||
| 165 | sk_load_half_negative_offset: | ||
| 166 | .globl sk_load_half_negative_offset | ||
| 167 | sk_negative_common(2) | ||
| 168 | mov (%rax),%ax | ||
| 169 | rol $8,%ax | ||
| 170 | movzwl %ax,%eax | ||
| 171 | ret | ||
| 172 | |||
| 173 | bpf_slow_path_byte_neg: | ||
| 174 | cmp SKF_MAX_NEG_OFF, %esi | ||
| 175 | jl bpf_error | ||
| 176 | sk_load_byte_negative_offset: | ||
| 177 | .globl sk_load_byte_negative_offset | ||
| 178 | sk_negative_common(1) | ||
| 179 | movzbl (%rax), %eax | ||
| 180 | ret | ||
| 181 | |||
| 182 | bpf_slow_path_byte_msh_neg: | ||
| 183 | cmp SKF_MAX_NEG_OFF, %esi | ||
| 184 | jl bpf_error | ||
| 185 | sk_load_byte_msh_negative_offset: | ||
| 186 | .globl sk_load_byte_msh_negative_offset | ||
| 187 | xchg %eax,%ebx /* dont lose A , X is about to be scratched */ | ||
| 188 | sk_negative_common(1) | ||
| 189 | movzbl (%rax),%eax | ||
| 190 | and $15,%al | ||
| 191 | shl $2,%al | ||
| 192 | xchg %eax,%ebx | ||
| 193 | ret | ||
| 194 | |||
| 195 | bpf_error: | ||
| 196 | # force a return 0 from jit handler | ||
| 197 | xor %eax,%eax | ||
| 198 | mov -8(%rbp),%rbx | ||
| 199 | leaveq | ||
| 200 | ret | ||
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 5a5b6e4dd738..0597f95b6da6 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c | |||
| @@ -30,7 +30,10 @@ int bpf_jit_enable __read_mostly; | |||
| 30 | * assembly code in arch/x86/net/bpf_jit.S | 30 | * assembly code in arch/x86/net/bpf_jit.S |
| 31 | */ | 31 | */ |
| 32 | extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[]; | 32 | extern u8 sk_load_word[], sk_load_half[], sk_load_byte[], sk_load_byte_msh[]; |
| 33 | extern u8 sk_load_word_ind[], sk_load_half_ind[], sk_load_byte_ind[]; | 33 | extern u8 sk_load_word_positive_offset[], sk_load_half_positive_offset[]; |
| 34 | extern u8 sk_load_byte_positive_offset[], sk_load_byte_msh_positive_offset[]; | ||
| 35 | extern u8 sk_load_word_negative_offset[], sk_load_half_negative_offset[]; | ||
| 36 | extern u8 sk_load_byte_negative_offset[], sk_load_byte_msh_negative_offset[]; | ||
| 34 | 37 | ||
| 35 | static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len) | 38 | static inline u8 *emit_code(u8 *ptr, u32 bytes, unsigned int len) |
| 36 | { | 39 | { |
| @@ -117,6 +120,8 @@ static inline void bpf_flush_icache(void *start, void *end) | |||
| 117 | set_fs(old_fs); | 120 | set_fs(old_fs); |
| 118 | } | 121 | } |
| 119 | 122 | ||
| 123 | #define CHOOSE_LOAD_FUNC(K, func) \ | ||
| 124 | ((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative_offset : func) : func##_positive_offset) | ||
| 120 | 125 | ||
| 121 | void bpf_jit_compile(struct sk_filter *fp) | 126 | void bpf_jit_compile(struct sk_filter *fp) |
| 122 | { | 127 | { |
| @@ -473,44 +478,46 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
| 473 | #endif | 478 | #endif |
| 474 | break; | 479 | break; |
| 475 | case BPF_S_LD_W_ABS: | 480 | case BPF_S_LD_W_ABS: |
| 476 | func = sk_load_word; | 481 | func = CHOOSE_LOAD_FUNC(K, sk_load_word); |
| 477 | common_load: seen |= SEEN_DATAREF; | 482 | common_load: seen |= SEEN_DATAREF; |
| 478 | if ((int)K < 0) { | ||
| 479 | /* Abort the JIT because __load_pointer() is needed. */ | ||
| 480 | goto out; | ||
| 481 | } | ||
| 482 | t_offset = func - (image + addrs[i]); | 483 | t_offset = func - (image + addrs[i]); |
| 483 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 484 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ |
| 484 | EMIT1_off32(0xe8, t_offset); /* call */ | 485 | EMIT1_off32(0xe8, t_offset); /* call */ |
| 485 | break; | 486 | break; |
| 486 | case BPF_S_LD_H_ABS: | 487 | case BPF_S_LD_H_ABS: |
| 487 | func = sk_load_half; | 488 | func = CHOOSE_LOAD_FUNC(K, sk_load_half); |
| 488 | goto common_load; | 489 | goto common_load; |
| 489 | case BPF_S_LD_B_ABS: | 490 | case BPF_S_LD_B_ABS: |
| 490 | func = sk_load_byte; | 491 | func = CHOOSE_LOAD_FUNC(K, sk_load_byte); |
| 491 | goto common_load; | 492 | goto common_load; |
| 492 | case BPF_S_LDX_B_MSH: | 493 | case BPF_S_LDX_B_MSH: |
| 493 | if ((int)K < 0) { | 494 | func = CHOOSE_LOAD_FUNC(K, sk_load_byte_msh); |
| 494 | /* Abort the JIT because __load_pointer() is needed. */ | ||
| 495 | goto out; | ||
| 496 | } | ||
| 497 | seen |= SEEN_DATAREF | SEEN_XREG; | 495 | seen |= SEEN_DATAREF | SEEN_XREG; |
| 498 | t_offset = sk_load_byte_msh - (image + addrs[i]); | 496 | t_offset = func - (image + addrs[i]); |
| 499 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 497 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ |
| 500 | EMIT1_off32(0xe8, t_offset); /* call sk_load_byte_msh */ | 498 | EMIT1_off32(0xe8, t_offset); /* call sk_load_byte_msh */ |
| 501 | break; | 499 | break; |
| 502 | case BPF_S_LD_W_IND: | 500 | case BPF_S_LD_W_IND: |
| 503 | func = sk_load_word_ind; | 501 | func = sk_load_word; |
| 504 | common_load_ind: seen |= SEEN_DATAREF | SEEN_XREG; | 502 | common_load_ind: seen |= SEEN_DATAREF | SEEN_XREG; |
| 505 | t_offset = func - (image + addrs[i]); | 503 | t_offset = func - (image + addrs[i]); |
| 506 | EMIT1_off32(0xbe, K); /* mov imm32,%esi */ | 504 | if (K) { |
| 505 | if (is_imm8(K)) { | ||
| 506 | EMIT3(0x8d, 0x73, K); /* lea imm8(%rbx), %esi */ | ||
| 507 | } else { | ||
| 508 | EMIT2(0x8d, 0xb3); /* lea imm32(%rbx),%esi */ | ||
| 509 | EMIT(K, 4); | ||
| 510 | } | ||
| 511 | } else { | ||
| 512 | EMIT2(0x89,0xde); /* mov %ebx,%esi */ | ||
| 513 | } | ||
| 507 | EMIT1_off32(0xe8, t_offset); /* call sk_load_xxx_ind */ | 514 | EMIT1_off32(0xe8, t_offset); /* call sk_load_xxx_ind */ |
| 508 | break; | 515 | break; |
| 509 | case BPF_S_LD_H_IND: | 516 | case BPF_S_LD_H_IND: |
| 510 | func = sk_load_half_ind; | 517 | func = sk_load_half; |
| 511 | goto common_load_ind; | 518 | goto common_load_ind; |
| 512 | case BPF_S_LD_B_IND: | 519 | case BPF_S_LD_B_IND: |
| 513 | func = sk_load_byte_ind; | 520 | func = sk_load_byte; |
| 514 | goto common_load_ind; | 521 | goto common_load_ind; |
| 515 | case BPF_S_JMP_JA: | 522 | case BPF_S_JMP_JA: |
| 516 | t_offset = addrs[i + K] - addrs[i]; | 523 | t_offset = addrs[i + K] - addrs[i]; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 988828b479ed..b8e279479a6b 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1859,6 +1859,7 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd, | |||
| 1859 | #endif /* CONFIG_X86_64 */ | 1859 | #endif /* CONFIG_X86_64 */ |
| 1860 | 1860 | ||
| 1861 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; | 1861 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; |
| 1862 | static unsigned char fake_ioapic_mapping[PAGE_SIZE] __page_aligned_bss; | ||
| 1862 | 1863 | ||
| 1863 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | 1864 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) |
| 1864 | { | 1865 | { |
| @@ -1899,7 +1900,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
| 1899 | * We just don't map the IO APIC - all access is via | 1900 | * We just don't map the IO APIC - all access is via |
| 1900 | * hypercalls. Keep the address in the pte for reference. | 1901 | * hypercalls. Keep the address in the pte for reference. |
| 1901 | */ | 1902 | */ |
| 1902 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | 1903 | pte = pfn_pte(PFN_DOWN(__pa(fake_ioapic_mapping)), PAGE_KERNEL); |
| 1903 | break; | 1904 | break; |
| 1904 | #endif | 1905 | #endif |
| 1905 | 1906 | ||
| @@ -2064,6 +2065,7 @@ void __init xen_init_mmu_ops(void) | |||
| 2064 | pv_mmu_ops = xen_mmu_ops; | 2065 | pv_mmu_ops = xen_mmu_ops; |
| 2065 | 2066 | ||
| 2066 | memset(dummy_mapping, 0xff, PAGE_SIZE); | 2067 | memset(dummy_mapping, 0xff, PAGE_SIZE); |
| 2068 | memset(fake_ioapic_mapping, 0xfd, PAGE_SIZE); | ||
| 2067 | } | 2069 | } |
| 2068 | 2070 | ||
| 2069 | /* Protected by xen_reservation_lock. */ | 2071 | /* Protected by xen_reservation_lock. */ |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 02900e8ce26c..5fac6919b957 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -59,7 +59,7 @@ static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id) | |||
| 59 | 59 | ||
| 60 | static void __cpuinit cpu_bringup(void) | 60 | static void __cpuinit cpu_bringup(void) |
| 61 | { | 61 | { |
| 62 | int cpu = smp_processor_id(); | 62 | int cpu; |
| 63 | 63 | ||
| 64 | cpu_init(); | 64 | cpu_init(); |
| 65 | touch_softlockup_watchdog(); | 65 | touch_softlockup_watchdog(); |
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c index b258cab9061c..7586544fddb4 100644 --- a/drivers/acpi/ec_sys.c +++ b/drivers/acpi/ec_sys.c | |||
| @@ -27,12 +27,6 @@ MODULE_PARM_DESC(write_support, "Dangerous, reboot and removal of battery may " | |||
| 27 | 27 | ||
| 28 | static struct dentry *acpi_ec_debugfs_dir; | 28 | static struct dentry *acpi_ec_debugfs_dir; |
| 29 | 29 | ||
| 30 | static int acpi_ec_open_io(struct inode *i, struct file *f) | ||
| 31 | { | ||
| 32 | f->private_data = i->i_private; | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | |||
| 36 | static ssize_t acpi_ec_read_io(struct file *f, char __user *buf, | 30 | static ssize_t acpi_ec_read_io(struct file *f, char __user *buf, |
| 37 | size_t count, loff_t *off) | 31 | size_t count, loff_t *off) |
| 38 | { | 32 | { |
| @@ -95,7 +89,7 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf, | |||
| 95 | 89 | ||
| 96 | static const struct file_operations acpi_ec_io_ops = { | 90 | static const struct file_operations acpi_ec_io_ops = { |
| 97 | .owner = THIS_MODULE, | 91 | .owner = THIS_MODULE, |
| 98 | .open = acpi_ec_open_io, | 92 | .open = simple_open, |
| 99 | .read = acpi_ec_read_io, | 93 | .read = acpi_ec_read_io, |
| 100 | .write = acpi_ec_write_io, | 94 | .write = acpi_ec_write_io, |
| 101 | .llseek = default_llseek, | 95 | .llseek = default_llseek, |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index b3447f63e46b..f3decb30223f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
| @@ -786,7 +786,7 @@ static int acpi_idle_play_dead(struct cpuidle_device *dev, int index) | |||
| 786 | while (1) { | 786 | while (1) { |
| 787 | 787 | ||
| 788 | if (cx->entry_method == ACPI_CSTATE_HALT) | 788 | if (cx->entry_method == ACPI_CSTATE_HALT) |
| 789 | halt(); | 789 | safe_halt(); |
| 790 | else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { | 790 | else if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { |
| 791 | inb(cx->address); | 791 | inb(cx->address); |
| 792 | /* See comment in acpi_idle_do_entry() */ | 792 | /* See comment in acpi_idle_do_entry() */ |
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 58517a5dac13..251eb70f83e7 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c | |||
| @@ -27,12 +27,6 @@ static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size) | |||
| 27 | return strlen(buf); | 27 | return strlen(buf); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | static int regmap_open_file(struct inode *inode, struct file *file) | ||
| 31 | { | ||
| 32 | file->private_data = inode->i_private; | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | |||
| 36 | static ssize_t regmap_name_read_file(struct file *file, | 30 | static ssize_t regmap_name_read_file(struct file *file, |
| 37 | char __user *user_buf, size_t count, | 31 | char __user *user_buf, size_t count, |
| 38 | loff_t *ppos) | 32 | loff_t *ppos) |
| @@ -57,7 +51,7 @@ static ssize_t regmap_name_read_file(struct file *file, | |||
| 57 | } | 51 | } |
| 58 | 52 | ||
| 59 | static const struct file_operations regmap_name_fops = { | 53 | static const struct file_operations regmap_name_fops = { |
| 60 | .open = regmap_open_file, | 54 | .open = simple_open, |
| 61 | .read = regmap_name_read_file, | 55 | .read = regmap_name_read_file, |
| 62 | .llseek = default_llseek, | 56 | .llseek = default_llseek, |
| 63 | }; | 57 | }; |
| @@ -174,7 +168,7 @@ static ssize_t regmap_map_write_file(struct file *file, | |||
| 174 | #endif | 168 | #endif |
| 175 | 169 | ||
| 176 | static const struct file_operations regmap_map_fops = { | 170 | static const struct file_operations regmap_map_fops = { |
| 177 | .open = regmap_open_file, | 171 | .open = simple_open, |
| 178 | .read = regmap_map_read_file, | 172 | .read = regmap_map_read_file, |
| 179 | .write = regmap_map_write_file, | 173 | .write = regmap_map_write_file, |
| 180 | .llseek = default_llseek, | 174 | .llseek = default_llseek, |
| @@ -243,7 +237,7 @@ out: | |||
| 243 | } | 237 | } |
| 244 | 238 | ||
| 245 | static const struct file_operations regmap_access_fops = { | 239 | static const struct file_operations regmap_access_fops = { |
| 246 | .open = regmap_open_file, | 240 | .open = simple_open, |
| 247 | .read = regmap_access_read_file, | 241 | .read = regmap_access_read_file, |
| 248 | .llseek = default_llseek, | 242 | .llseek = default_llseek, |
| 249 | }; | 243 | }; |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index d5e1ab956740..98cbeba8cd53 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -1475,7 +1475,7 @@ static int __init xlblk_init(void) | |||
| 1475 | if (!xen_domain()) | 1475 | if (!xen_domain()) |
| 1476 | return -ENODEV; | 1476 | return -ENODEV; |
| 1477 | 1477 | ||
| 1478 | if (!xen_platform_pci_unplug) | 1478 | if (xen_hvm_domain() && !xen_platform_pci_unplug) |
| 1479 | return -ENODEV; | 1479 | return -ENODEV; |
| 1480 | 1480 | ||
| 1481 | if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) { | 1481 | if (register_blkdev(XENVBD_MAJOR, DEV_NAME)) { |
diff --git a/drivers/bluetooth/btmrvl_debugfs.c b/drivers/bluetooth/btmrvl_debugfs.c index 6c20bbb54b71..428dbb7574bd 100644 --- a/drivers/bluetooth/btmrvl_debugfs.c +++ b/drivers/bluetooth/btmrvl_debugfs.c | |||
| @@ -45,12 +45,6 @@ struct btmrvl_debugfs_data { | |||
| 45 | struct dentry *txdnldready; | 45 | struct dentry *txdnldready; |
| 46 | }; | 46 | }; |
| 47 | 47 | ||
| 48 | static int btmrvl_open_generic(struct inode *inode, struct file *file) | ||
| 49 | { | ||
| 50 | file->private_data = inode->i_private; | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | |||
| 54 | static ssize_t btmrvl_hscfgcmd_write(struct file *file, | 48 | static ssize_t btmrvl_hscfgcmd_write(struct file *file, |
| 55 | const char __user *ubuf, size_t count, loff_t *ppos) | 49 | const char __user *ubuf, size_t count, loff_t *ppos) |
| 56 | { | 50 | { |
| @@ -93,7 +87,7 @@ static ssize_t btmrvl_hscfgcmd_read(struct file *file, char __user *userbuf, | |||
| 93 | static const struct file_operations btmrvl_hscfgcmd_fops = { | 87 | static const struct file_operations btmrvl_hscfgcmd_fops = { |
| 94 | .read = btmrvl_hscfgcmd_read, | 88 | .read = btmrvl_hscfgcmd_read, |
| 95 | .write = btmrvl_hscfgcmd_write, | 89 | .write = btmrvl_hscfgcmd_write, |
| 96 | .open = btmrvl_open_generic, | 90 | .open = simple_open, |
| 97 | .llseek = default_llseek, | 91 | .llseek = default_llseek, |
| 98 | }; | 92 | }; |
| 99 | 93 | ||
| @@ -134,7 +128,7 @@ static ssize_t btmrvl_psmode_read(struct file *file, char __user *userbuf, | |||
| 134 | static const struct file_operations btmrvl_psmode_fops = { | 128 | static const struct file_operations btmrvl_psmode_fops = { |
| 135 | .read = btmrvl_psmode_read, | 129 | .read = btmrvl_psmode_read, |
| 136 | .write = btmrvl_psmode_write, | 130 | .write = btmrvl_psmode_write, |
| 137 | .open = btmrvl_open_generic, | 131 | .open = simple_open, |
| 138 | .llseek = default_llseek, | 132 | .llseek = default_llseek, |
| 139 | }; | 133 | }; |
| 140 | 134 | ||
| @@ -180,7 +174,7 @@ static ssize_t btmrvl_pscmd_read(struct file *file, char __user *userbuf, | |||
| 180 | static const struct file_operations btmrvl_pscmd_fops = { | 174 | static const struct file_operations btmrvl_pscmd_fops = { |
| 181 | .read = btmrvl_pscmd_read, | 175 | .read = btmrvl_pscmd_read, |
| 182 | .write = btmrvl_pscmd_write, | 176 | .write = btmrvl_pscmd_write, |
| 183 | .open = btmrvl_open_generic, | 177 | .open = simple_open, |
| 184 | .llseek = default_llseek, | 178 | .llseek = default_llseek, |
| 185 | }; | 179 | }; |
| 186 | 180 | ||
| @@ -221,7 +215,7 @@ static ssize_t btmrvl_gpiogap_read(struct file *file, char __user *userbuf, | |||
| 221 | static const struct file_operations btmrvl_gpiogap_fops = { | 215 | static const struct file_operations btmrvl_gpiogap_fops = { |
| 222 | .read = btmrvl_gpiogap_read, | 216 | .read = btmrvl_gpiogap_read, |
| 223 | .write = btmrvl_gpiogap_write, | 217 | .write = btmrvl_gpiogap_write, |
| 224 | .open = btmrvl_open_generic, | 218 | .open = simple_open, |
| 225 | .llseek = default_llseek, | 219 | .llseek = default_llseek, |
| 226 | }; | 220 | }; |
| 227 | 221 | ||
| @@ -265,7 +259,7 @@ static ssize_t btmrvl_hscmd_read(struct file *file, char __user *userbuf, | |||
| 265 | static const struct file_operations btmrvl_hscmd_fops = { | 259 | static const struct file_operations btmrvl_hscmd_fops = { |
| 266 | .read = btmrvl_hscmd_read, | 260 | .read = btmrvl_hscmd_read, |
| 267 | .write = btmrvl_hscmd_write, | 261 | .write = btmrvl_hscmd_write, |
| 268 | .open = btmrvl_open_generic, | 262 | .open = simple_open, |
| 269 | .llseek = default_llseek, | 263 | .llseek = default_llseek, |
| 270 | }; | 264 | }; |
| 271 | 265 | ||
| @@ -305,7 +299,7 @@ static ssize_t btmrvl_hsmode_read(struct file *file, char __user * userbuf, | |||
| 305 | static const struct file_operations btmrvl_hsmode_fops = { | 299 | static const struct file_operations btmrvl_hsmode_fops = { |
| 306 | .read = btmrvl_hsmode_read, | 300 | .read = btmrvl_hsmode_read, |
| 307 | .write = btmrvl_hsmode_write, | 301 | .write = btmrvl_hsmode_write, |
| 308 | .open = btmrvl_open_generic, | 302 | .open = simple_open, |
| 309 | .llseek = default_llseek, | 303 | .llseek = default_llseek, |
| 310 | }; | 304 | }; |
| 311 | 305 | ||
| @@ -323,7 +317,7 @@ static ssize_t btmrvl_curpsmode_read(struct file *file, char __user *userbuf, | |||
| 323 | 317 | ||
| 324 | static const struct file_operations btmrvl_curpsmode_fops = { | 318 | static const struct file_operations btmrvl_curpsmode_fops = { |
| 325 | .read = btmrvl_curpsmode_read, | 319 | .read = btmrvl_curpsmode_read, |
| 326 | .open = btmrvl_open_generic, | 320 | .open = simple_open, |
| 327 | .llseek = default_llseek, | 321 | .llseek = default_llseek, |
| 328 | }; | 322 | }; |
| 329 | 323 | ||
| @@ -341,7 +335,7 @@ static ssize_t btmrvl_psstate_read(struct file *file, char __user * userbuf, | |||
| 341 | 335 | ||
| 342 | static const struct file_operations btmrvl_psstate_fops = { | 336 | static const struct file_operations btmrvl_psstate_fops = { |
| 343 | .read = btmrvl_psstate_read, | 337 | .read = btmrvl_psstate_read, |
| 344 | .open = btmrvl_open_generic, | 338 | .open = simple_open, |
| 345 | .llseek = default_llseek, | 339 | .llseek = default_llseek, |
| 346 | }; | 340 | }; |
| 347 | 341 | ||
| @@ -359,7 +353,7 @@ static ssize_t btmrvl_hsstate_read(struct file *file, char __user *userbuf, | |||
| 359 | 353 | ||
| 360 | static const struct file_operations btmrvl_hsstate_fops = { | 354 | static const struct file_operations btmrvl_hsstate_fops = { |
| 361 | .read = btmrvl_hsstate_read, | 355 | .read = btmrvl_hsstate_read, |
| 362 | .open = btmrvl_open_generic, | 356 | .open = simple_open, |
| 363 | .llseek = default_llseek, | 357 | .llseek = default_llseek, |
| 364 | }; | 358 | }; |
| 365 | 359 | ||
| @@ -378,7 +372,7 @@ static ssize_t btmrvl_txdnldready_read(struct file *file, char __user *userbuf, | |||
| 378 | 372 | ||
| 379 | static const struct file_operations btmrvl_txdnldready_fops = { | 373 | static const struct file_operations btmrvl_txdnldready_fops = { |
| 380 | .read = btmrvl_txdnldready_read, | 374 | .read = btmrvl_txdnldready_read, |
| 381 | .open = btmrvl_open_generic, | 375 | .open = simple_open, |
| 382 | .llseek = default_llseek, | 376 | .llseek = default_llseek, |
| 383 | }; | 377 | }; |
| 384 | 378 | ||
diff --git a/drivers/char/apm-emulation.c b/drivers/char/apm-emulation.c index 57501ca9204b..46118f845948 100644 --- a/drivers/char/apm-emulation.c +++ b/drivers/char/apm-emulation.c | |||
| @@ -301,7 +301,7 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) | |||
| 301 | * anything critical, chill a bit on each iteration. | 301 | * anything critical, chill a bit on each iteration. |
| 302 | */ | 302 | */ |
| 303 | while (wait_event_freezable(apm_suspend_waitqueue, | 303 | while (wait_event_freezable(apm_suspend_waitqueue, |
| 304 | as->suspend_state == SUSPEND_DONE)) | 304 | as->suspend_state != SUSPEND_ACKED)) |
| 305 | msleep(10); | 305 | msleep(10); |
| 306 | break; | 306 | break; |
| 307 | case SUSPEND_ACKTO: | 307 | case SUSPEND_ACKTO: |
diff --git a/drivers/char/tile-srom.c b/drivers/char/tile-srom.c index 4dc019408fac..3b22a606f79d 100644 --- a/drivers/char/tile-srom.c +++ b/drivers/char/tile-srom.c | |||
| @@ -194,17 +194,17 @@ static ssize_t srom_read(struct file *filp, char __user *buf, | |||
| 194 | 194 | ||
| 195 | hv_retval = _srom_read(srom->hv_devhdl, kernbuf, | 195 | hv_retval = _srom_read(srom->hv_devhdl, kernbuf, |
| 196 | *f_pos, bytes_this_pass); | 196 | *f_pos, bytes_this_pass); |
| 197 | if (hv_retval > 0) { | 197 | if (hv_retval <= 0) { |
| 198 | if (copy_to_user(buf, kernbuf, hv_retval) != 0) { | ||
| 199 | retval = -EFAULT; | ||
| 200 | break; | ||
| 201 | } | ||
| 202 | } else if (hv_retval <= 0) { | ||
| 203 | if (retval == 0) | 198 | if (retval == 0) |
| 204 | retval = hv_retval; | 199 | retval = hv_retval; |
| 205 | break; | 200 | break; |
| 206 | } | 201 | } |
| 207 | 202 | ||
| 203 | if (copy_to_user(buf, kernbuf, hv_retval) != 0) { | ||
| 204 | retval = -EFAULT; | ||
| 205 | break; | ||
| 206 | } | ||
| 207 | |||
| 208 | retval += hv_retval; | 208 | retval += hv_retval; |
| 209 | *f_pos += hv_retval; | 209 | *f_pos += hv_retval; |
| 210 | buf += hv_retval; | 210 | buf += hv_retval; |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index b58b56187065..ddf86b6500b7 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
| @@ -1038,12 +1038,6 @@ static struct attribute_group port_attribute_group = { | |||
| 1038 | .attrs = port_sysfs_entries, | 1038 | .attrs = port_sysfs_entries, |
| 1039 | }; | 1039 | }; |
| 1040 | 1040 | ||
| 1041 | static int debugfs_open(struct inode *inode, struct file *filp) | ||
| 1042 | { | ||
| 1043 | filp->private_data = inode->i_private; | ||
| 1044 | return 0; | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | static ssize_t debugfs_read(struct file *filp, char __user *ubuf, | 1041 | static ssize_t debugfs_read(struct file *filp, char __user *ubuf, |
| 1048 | size_t count, loff_t *offp) | 1042 | size_t count, loff_t *offp) |
| 1049 | { | 1043 | { |
| @@ -1087,7 +1081,7 @@ static ssize_t debugfs_read(struct file *filp, char __user *ubuf, | |||
| 1087 | 1081 | ||
| 1088 | static const struct file_operations port_debugfs_ops = { | 1082 | static const struct file_operations port_debugfs_ops = { |
| 1089 | .owner = THIS_MODULE, | 1083 | .owner = THIS_MODULE, |
| 1090 | .open = debugfs_open, | 1084 | .open = simple_open, |
| 1091 | .read = debugfs_read, | 1085 | .read = debugfs_read, |
| 1092 | }; | 1086 | }; |
| 1093 | 1087 | ||
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 32d790dd8180..ffbb44685915 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
| @@ -51,9 +51,6 @@ config ARM_S5PV210_CPUFREQ | |||
| 51 | config ARM_EXYNOS_CPUFREQ | 51 | config ARM_EXYNOS_CPUFREQ |
| 52 | bool "SAMSUNG EXYNOS SoCs" | 52 | bool "SAMSUNG EXYNOS SoCs" |
| 53 | depends on ARCH_EXYNOS | 53 | depends on ARCH_EXYNOS |
| 54 | select ARM_EXYNOS4210_CPUFREQ if CPU_EXYNOS4210 | ||
| 55 | select ARM_EXYNOS4X12_CPUFREQ if (SOC_EXYNOS4212 || SOC_EXYNOS4412) | ||
| 56 | select ARM_EXYNOS5250_CPUFREQ if SOC_EXYNOS5250 | ||
| 57 | default y | 54 | default y |
| 58 | help | 55 | help |
| 59 | This adds the CPUFreq driver common part for Samsung | 56 | This adds the CPUFreq driver common part for Samsung |
| @@ -62,20 +59,19 @@ config ARM_EXYNOS_CPUFREQ | |||
| 62 | If in doubt, say N. | 59 | If in doubt, say N. |
| 63 | 60 | ||
| 64 | config ARM_EXYNOS4210_CPUFREQ | 61 | config ARM_EXYNOS4210_CPUFREQ |
| 65 | bool "Samsung EXYNOS4210" | 62 | def_bool CPU_EXYNOS4210 |
| 66 | depends on ARCH_EXYNOS | ||
| 67 | help | 63 | help |
| 68 | This adds the CPUFreq driver for Samsung EXYNOS4210 | 64 | This adds the CPUFreq driver for Samsung EXYNOS4210 |
| 69 | SoC (S5PV310 or S5PC210). | 65 | SoC (S5PV310 or S5PC210). |
| 70 | 66 | ||
| 71 | config ARM_EXYNOS4X12_CPUFREQ | 67 | config ARM_EXYNOS4X12_CPUFREQ |
| 72 | bool "Samsung EXYNOS4X12" | 68 | def_bool (SOC_EXYNOS4212 || SOC_EXYNOS4412) |
| 73 | help | 69 | help |
| 74 | This adds the CPUFreq driver for Samsung EXYNOS4X12 | 70 | This adds the CPUFreq driver for Samsung EXYNOS4X12 |
| 75 | SoC (EXYNOS4212 or EXYNOS4412). | 71 | SoC (EXYNOS4212 or EXYNOS4412). |
| 76 | 72 | ||
| 77 | config ARM_EXYNOS5250_CPUFREQ | 73 | config ARM_EXYNOS5250_CPUFREQ |
| 78 | bool "Samsung EXYNOS5250" | 74 | def_bool SOC_EXYNOS5250 |
| 79 | help | 75 | help |
| 80 | This adds the CPUFreq driver for Samsung EXYNOS5250 | 76 | This adds the CPUFreq driver for Samsung EXYNOS5250 |
| 81 | SoC. | 77 | SoC. |
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 87411cebc577..2f0083a51a9a 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -74,7 +74,7 @@ static cpuidle_enter_t cpuidle_enter_ops; | |||
| 74 | /** | 74 | /** |
| 75 | * cpuidle_play_dead - cpu off-lining | 75 | * cpuidle_play_dead - cpu off-lining |
| 76 | * | 76 | * |
| 77 | * Only returns in case of an error | 77 | * Returns in case of an error or no driver |
| 78 | */ | 78 | */ |
| 79 | int cpuidle_play_dead(void) | 79 | int cpuidle_play_dead(void) |
| 80 | { | 80 | { |
| @@ -83,6 +83,9 @@ int cpuidle_play_dead(void) | |||
| 83 | int i, dead_state = -1; | 83 | int i, dead_state = -1; |
| 84 | int power_usage = -1; | 84 | int power_usage = -1; |
| 85 | 85 | ||
| 86 | if (!drv) | ||
| 87 | return -ENODEV; | ||
| 88 | |||
| 86 | /* Find lowest-power state that supports long-term idle */ | 89 | /* Find lowest-power state that supports long-term idle */ |
| 87 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { | 90 | for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) { |
| 88 | struct cpuidle_state *s = &drv->states[i]; | 91 | struct cpuidle_state *s = &drv->states[i]; |
diff --git a/drivers/dma/coh901318.c b/drivers/dma/coh901318.c index dc89455f5550..750925f9638b 100644 --- a/drivers/dma/coh901318.c +++ b/drivers/dma/coh901318.c | |||
| @@ -104,13 +104,6 @@ static void coh901318_list_print(struct coh901318_chan *cohc, | |||
| 104 | static struct coh901318_base *debugfs_dma_base; | 104 | static struct coh901318_base *debugfs_dma_base; |
| 105 | static struct dentry *dma_dentry; | 105 | static struct dentry *dma_dentry; |
| 106 | 106 | ||
| 107 | static int coh901318_debugfs_open(struct inode *inode, struct file *file) | ||
| 108 | { | ||
| 109 | |||
| 110 | file->private_data = inode->i_private; | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | static int coh901318_debugfs_read(struct file *file, char __user *buf, | 107 | static int coh901318_debugfs_read(struct file *file, char __user *buf, |
| 115 | size_t count, loff_t *f_pos) | 108 | size_t count, loff_t *f_pos) |
| 116 | { | 109 | { |
| @@ -158,7 +151,7 @@ static int coh901318_debugfs_read(struct file *file, char __user *buf, | |||
| 158 | 151 | ||
| 159 | static const struct file_operations coh901318_debugfs_status_operations = { | 152 | static const struct file_operations coh901318_debugfs_status_operations = { |
| 160 | .owner = THIS_MODULE, | 153 | .owner = THIS_MODULE, |
| 161 | .open = coh901318_debugfs_open, | 154 | .open = simple_open, |
| 162 | .read = coh901318_debugfs_read, | 155 | .read = coh901318_debugfs_read, |
| 163 | .llseek = default_llseek, | 156 | .llseek = default_llseek, |
| 164 | }; | 157 | }; |
diff --git a/drivers/edac/tile_edac.c b/drivers/edac/tile_edac.c index 1d5cf06f6c6b..e99d00976189 100644 --- a/drivers/edac/tile_edac.c +++ b/drivers/edac/tile_edac.c | |||
| @@ -145,7 +145,11 @@ static int __devinit tile_edac_mc_probe(struct platform_device *pdev) | |||
| 145 | mci->edac_ctl_cap = EDAC_FLAG_SECDED; | 145 | mci->edac_ctl_cap = EDAC_FLAG_SECDED; |
| 146 | 146 | ||
| 147 | mci->mod_name = DRV_NAME; | 147 | mci->mod_name = DRV_NAME; |
| 148 | #ifdef __tilegx__ | ||
| 149 | mci->ctl_name = "TILEGx_Memory_Controller"; | ||
| 150 | #else | ||
| 148 | mci->ctl_name = "TILEPro_Memory_Controller"; | 151 | mci->ctl_name = "TILEPro_Memory_Controller"; |
| 152 | #endif | ||
| 149 | mci->dev_name = dev_name(&pdev->dev); | 153 | mci->dev_name = dev_name(&pdev->dev); |
| 150 | mci->edac_check = tile_edac_check; | 154 | mci->edac_check = tile_edac_check; |
| 151 | 155 | ||
diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 32de6707e3c4..12f349b3830d 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #include <linux/interrupt.h> | 22 | #include <linux/interrupt.h> |
| 23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/of.h> | 25 | #include <linux/of_device.h> |
| 26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/irqdomain.h> | 28 | #include <linux/irqdomain.h> |
| @@ -37,7 +37,8 @@ | |||
| 37 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) | 37 | #define GPIO_PORT(x) (((x) >> 3) & 0x3) |
| 38 | #define GPIO_BIT(x) ((x) & 0x7) | 38 | #define GPIO_BIT(x) ((x) & 0x7) |
| 39 | 39 | ||
| 40 | #define GPIO_REG(x) (GPIO_BANK(x) * 0x80 + GPIO_PORT(x) * 4) | 40 | #define GPIO_REG(x) (GPIO_BANK(x) * tegra_gpio_bank_stride + \ |
| 41 | GPIO_PORT(x) * 4) | ||
| 41 | 42 | ||
| 42 | #define GPIO_CNF(x) (GPIO_REG(x) + 0x00) | 43 | #define GPIO_CNF(x) (GPIO_REG(x) + 0x00) |
| 43 | #define GPIO_OE(x) (GPIO_REG(x) + 0x10) | 44 | #define GPIO_OE(x) (GPIO_REG(x) + 0x10) |
| @@ -48,12 +49,12 @@ | |||
| 48 | #define GPIO_INT_LVL(x) (GPIO_REG(x) + 0x60) | 49 | #define GPIO_INT_LVL(x) (GPIO_REG(x) + 0x60) |
| 49 | #define GPIO_INT_CLR(x) (GPIO_REG(x) + 0x70) | 50 | #define GPIO_INT_CLR(x) (GPIO_REG(x) + 0x70) |
| 50 | 51 | ||
| 51 | #define GPIO_MSK_CNF(x) (GPIO_REG(x) + 0x800) | 52 | #define GPIO_MSK_CNF(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x00) |
| 52 | #define GPIO_MSK_OE(x) (GPIO_REG(x) + 0x810) | 53 | #define GPIO_MSK_OE(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x10) |
| 53 | #define GPIO_MSK_OUT(x) (GPIO_REG(x) + 0X820) | 54 | #define GPIO_MSK_OUT(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0X20) |
| 54 | #define GPIO_MSK_INT_STA(x) (GPIO_REG(x) + 0x840) | 55 | #define GPIO_MSK_INT_STA(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x40) |
| 55 | #define GPIO_MSK_INT_ENB(x) (GPIO_REG(x) + 0x850) | 56 | #define GPIO_MSK_INT_ENB(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x50) |
| 56 | #define GPIO_MSK_INT_LVL(x) (GPIO_REG(x) + 0x860) | 57 | #define GPIO_MSK_INT_LVL(x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x60) |
| 57 | 58 | ||
| 58 | #define GPIO_INT_LVL_MASK 0x010101 | 59 | #define GPIO_INT_LVL_MASK 0x010101 |
| 59 | #define GPIO_INT_LVL_EDGE_RISING 0x000101 | 60 | #define GPIO_INT_LVL_EDGE_RISING 0x000101 |
| @@ -78,6 +79,8 @@ struct tegra_gpio_bank { | |||
| 78 | static struct irq_domain *irq_domain; | 79 | static struct irq_domain *irq_domain; |
| 79 | static void __iomem *regs; | 80 | static void __iomem *regs; |
| 80 | static u32 tegra_gpio_bank_count; | 81 | static u32 tegra_gpio_bank_count; |
| 82 | static u32 tegra_gpio_bank_stride; | ||
| 83 | static u32 tegra_gpio_upper_offset; | ||
| 81 | static struct tegra_gpio_bank *tegra_gpio_banks; | 84 | static struct tegra_gpio_bank *tegra_gpio_banks; |
| 82 | 85 | ||
| 83 | static inline void tegra_gpio_writel(u32 val, u32 reg) | 86 | static inline void tegra_gpio_writel(u32 val, u32 reg) |
| @@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = { | |||
| 333 | #endif | 336 | #endif |
| 334 | }; | 337 | }; |
| 335 | 338 | ||
| 339 | struct tegra_gpio_soc_config { | ||
| 340 | u32 bank_stride; | ||
| 341 | u32 upper_offset; | ||
| 342 | }; | ||
| 343 | |||
| 344 | static struct tegra_gpio_soc_config tegra20_gpio_config = { | ||
| 345 | .bank_stride = 0x80, | ||
| 346 | .upper_offset = 0x800, | ||
| 347 | }; | ||
| 348 | |||
| 349 | static struct tegra_gpio_soc_config tegra30_gpio_config = { | ||
| 350 | .bank_stride = 0x100, | ||
| 351 | .upper_offset = 0x80, | ||
| 352 | }; | ||
| 353 | |||
| 354 | static struct of_device_id tegra_gpio_of_match[] __devinitdata = { | ||
| 355 | { .compatible = "nvidia,tegra30-gpio", .data = &tegra30_gpio_config }, | ||
| 356 | { .compatible = "nvidia,tegra20-gpio", .data = &tegra20_gpio_config }, | ||
| 357 | { }, | ||
| 358 | }; | ||
| 336 | 359 | ||
| 337 | /* This lock class tells lockdep that GPIO irqs are in a different | 360 | /* This lock class tells lockdep that GPIO irqs are in a different |
| 338 | * category than their parents, so it won't report false recursion. | 361 | * category than their parents, so it won't report false recursion. |
| @@ -341,6 +364,8 @@ static struct lock_class_key gpio_lock_class; | |||
| 341 | 364 | ||
| 342 | static int __devinit tegra_gpio_probe(struct platform_device *pdev) | 365 | static int __devinit tegra_gpio_probe(struct platform_device *pdev) |
| 343 | { | 366 | { |
| 367 | const struct of_device_id *match; | ||
| 368 | struct tegra_gpio_soc_config *config; | ||
| 344 | int irq_base; | 369 | int irq_base; |
| 345 | struct resource *res; | 370 | struct resource *res; |
| 346 | struct tegra_gpio_bank *bank; | 371 | struct tegra_gpio_bank *bank; |
| @@ -348,6 +373,15 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
| 348 | int i; | 373 | int i; |
| 349 | int j; | 374 | int j; |
| 350 | 375 | ||
| 376 | match = of_match_device(tegra_gpio_of_match, &pdev->dev); | ||
| 377 | if (match) | ||
| 378 | config = (struct tegra_gpio_soc_config *)match->data; | ||
| 379 | else | ||
| 380 | config = &tegra20_gpio_config; | ||
| 381 | |||
| 382 | tegra_gpio_bank_stride = config->bank_stride; | ||
| 383 | tegra_gpio_upper_offset = config->upper_offset; | ||
| 384 | |||
| 351 | for (;;) { | 385 | for (;;) { |
| 352 | res = platform_get_resource(pdev, IORESOURCE_IRQ, tegra_gpio_bank_count); | 386 | res = platform_get_resource(pdev, IORESOURCE_IRQ, tegra_gpio_bank_count); |
| 353 | if (!res) | 387 | if (!res) |
| @@ -402,7 +436,7 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
| 402 | return -ENODEV; | 436 | return -ENODEV; |
| 403 | } | 437 | } |
| 404 | 438 | ||
| 405 | for (i = 0; i < 7; i++) { | 439 | for (i = 0; i < tegra_gpio_bank_count; i++) { |
| 406 | for (j = 0; j < 4; j++) { | 440 | for (j = 0; j < 4; j++) { |
| 407 | int gpio = tegra_gpio_compose(i, j, 0); | 441 | int gpio = tegra_gpio_compose(i, j, 0); |
| 408 | tegra_gpio_writel(0x00, GPIO_INT_ENB(gpio)); | 442 | tegra_gpio_writel(0x00, GPIO_INT_ENB(gpio)); |
| @@ -441,11 +475,6 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev) | |||
| 441 | return 0; | 475 | return 0; |
| 442 | } | 476 | } |
| 443 | 477 | ||
| 444 | static struct of_device_id tegra_gpio_of_match[] __devinitdata = { | ||
| 445 | { .compatible = "nvidia,tegra20-gpio", }, | ||
| 446 | { }, | ||
| 447 | }; | ||
| 448 | |||
| 449 | static struct platform_driver tegra_gpio_driver = { | 478 | static struct platform_driver tegra_gpio_driver = { |
| 450 | .driver = { | 479 | .driver = { |
| 451 | .name = "tegra-gpio", | 480 | .name = "tegra-gpio", |
| @@ -485,7 +514,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused) | |||
| 485 | int i; | 514 | int i; |
| 486 | int j; | 515 | int j; |
| 487 | 516 | ||
| 488 | for (i = 0; i < 7; i++) { | 517 | for (i = 0; i < tegra_gpio_bank_count; i++) { |
| 489 | for (j = 0; j < 4; j++) { | 518 | for (j = 0; j < 4; j++) { |
| 490 | int gpio = tegra_gpio_compose(i, j, 0); | 519 | int gpio = tegra_gpio_compose(i, j, 0); |
| 491 | seq_printf(s, | 520 | seq_printf(s, |
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index fdb7ccefffbd..b505b70dba05 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
| @@ -1502,14 +1502,6 @@ static int i915_ppgtt_info(struct seq_file *m, void *data) | |||
| 1502 | return 0; | 1502 | return 0; |
| 1503 | } | 1503 | } |
| 1504 | 1504 | ||
| 1505 | static int | ||
| 1506 | i915_debugfs_common_open(struct inode *inode, | ||
| 1507 | struct file *filp) | ||
| 1508 | { | ||
| 1509 | filp->private_data = inode->i_private; | ||
| 1510 | return 0; | ||
| 1511 | } | ||
| 1512 | |||
| 1513 | static ssize_t | 1505 | static ssize_t |
| 1514 | i915_wedged_read(struct file *filp, | 1506 | i915_wedged_read(struct file *filp, |
| 1515 | char __user *ubuf, | 1507 | char __user *ubuf, |
| @@ -1560,7 +1552,7 @@ i915_wedged_write(struct file *filp, | |||
| 1560 | 1552 | ||
| 1561 | static const struct file_operations i915_wedged_fops = { | 1553 | static const struct file_operations i915_wedged_fops = { |
| 1562 | .owner = THIS_MODULE, | 1554 | .owner = THIS_MODULE, |
| 1563 | .open = i915_debugfs_common_open, | 1555 | .open = simple_open, |
| 1564 | .read = i915_wedged_read, | 1556 | .read = i915_wedged_read, |
| 1565 | .write = i915_wedged_write, | 1557 | .write = i915_wedged_write, |
| 1566 | .llseek = default_llseek, | 1558 | .llseek = default_llseek, |
| @@ -1622,7 +1614,7 @@ i915_max_freq_write(struct file *filp, | |||
| 1622 | 1614 | ||
| 1623 | static const struct file_operations i915_max_freq_fops = { | 1615 | static const struct file_operations i915_max_freq_fops = { |
| 1624 | .owner = THIS_MODULE, | 1616 | .owner = THIS_MODULE, |
| 1625 | .open = i915_debugfs_common_open, | 1617 | .open = simple_open, |
| 1626 | .read = i915_max_freq_read, | 1618 | .read = i915_max_freq_read, |
| 1627 | .write = i915_max_freq_write, | 1619 | .write = i915_max_freq_write, |
| 1628 | .llseek = default_llseek, | 1620 | .llseek = default_llseek, |
| @@ -1693,7 +1685,7 @@ i915_cache_sharing_write(struct file *filp, | |||
| 1693 | 1685 | ||
| 1694 | static const struct file_operations i915_cache_sharing_fops = { | 1686 | static const struct file_operations i915_cache_sharing_fops = { |
| 1695 | .owner = THIS_MODULE, | 1687 | .owner = THIS_MODULE, |
| 1696 | .open = i915_debugfs_common_open, | 1688 | .open = simple_open, |
| 1697 | .read = i915_cache_sharing_read, | 1689 | .read = i915_cache_sharing_read, |
| 1698 | .write = i915_cache_sharing_write, | 1690 | .write = i915_cache_sharing_write, |
| 1699 | .llseek = default_llseek, | 1691 | .llseek = default_llseek, |
diff --git a/drivers/hid/hid-picolcd.c b/drivers/hid/hid-picolcd.c index 12f9777c385d..45c3433f7986 100644 --- a/drivers/hid/hid-picolcd.c +++ b/drivers/hid/hid-picolcd.c | |||
| @@ -1525,12 +1525,6 @@ static const struct file_operations picolcd_debug_reset_fops = { | |||
| 1525 | /* | 1525 | /* |
| 1526 | * The "eeprom" file | 1526 | * The "eeprom" file |
| 1527 | */ | 1527 | */ |
| 1528 | static int picolcd_debug_eeprom_open(struct inode *i, struct file *f) | ||
| 1529 | { | ||
| 1530 | f->private_data = i->i_private; | ||
| 1531 | return 0; | ||
| 1532 | } | ||
| 1533 | |||
| 1534 | static ssize_t picolcd_debug_eeprom_read(struct file *f, char __user *u, | 1528 | static ssize_t picolcd_debug_eeprom_read(struct file *f, char __user *u, |
| 1535 | size_t s, loff_t *off) | 1529 | size_t s, loff_t *off) |
| 1536 | { | 1530 | { |
| @@ -1618,7 +1612,7 @@ static ssize_t picolcd_debug_eeprom_write(struct file *f, const char __user *u, | |||
| 1618 | */ | 1612 | */ |
| 1619 | static const struct file_operations picolcd_debug_eeprom_fops = { | 1613 | static const struct file_operations picolcd_debug_eeprom_fops = { |
| 1620 | .owner = THIS_MODULE, | 1614 | .owner = THIS_MODULE, |
| 1621 | .open = picolcd_debug_eeprom_open, | 1615 | .open = simple_open, |
| 1622 | .read = picolcd_debug_eeprom_read, | 1616 | .read = picolcd_debug_eeprom_read, |
| 1623 | .write = picolcd_debug_eeprom_write, | 1617 | .write = picolcd_debug_eeprom_write, |
| 1624 | .llseek = generic_file_llseek, | 1618 | .llseek = generic_file_llseek, |
| @@ -1627,12 +1621,6 @@ static const struct file_operations picolcd_debug_eeprom_fops = { | |||
| 1627 | /* | 1621 | /* |
| 1628 | * The "flash" file | 1622 | * The "flash" file |
| 1629 | */ | 1623 | */ |
| 1630 | static int picolcd_debug_flash_open(struct inode *i, struct file *f) | ||
| 1631 | { | ||
| 1632 | f->private_data = i->i_private; | ||
| 1633 | return 0; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | /* record a flash address to buf (bounds check to be done by caller) */ | 1624 | /* record a flash address to buf (bounds check to be done by caller) */ |
| 1637 | static int _picolcd_flash_setaddr(struct picolcd_data *data, u8 *buf, long off) | 1625 | static int _picolcd_flash_setaddr(struct picolcd_data *data, u8 *buf, long off) |
| 1638 | { | 1626 | { |
| @@ -1817,7 +1805,7 @@ static ssize_t picolcd_debug_flash_write(struct file *f, const char __user *u, | |||
| 1817 | */ | 1805 | */ |
| 1818 | static const struct file_operations picolcd_debug_flash_fops = { | 1806 | static const struct file_operations picolcd_debug_flash_fops = { |
| 1819 | .owner = THIS_MODULE, | 1807 | .owner = THIS_MODULE, |
| 1820 | .open = picolcd_debug_flash_open, | 1808 | .open = simple_open, |
| 1821 | .read = picolcd_debug_flash_read, | 1809 | .read = picolcd_debug_flash_read, |
| 1822 | .write = picolcd_debug_flash_write, | 1810 | .write = picolcd_debug_flash_write, |
| 1823 | .llseek = generic_file_llseek, | 1811 | .llseek = generic_file_llseek, |
diff --git a/drivers/hid/hid-wiimote-debug.c b/drivers/hid/hid-wiimote-debug.c index 17dabc1f339e..eec329197c16 100644 --- a/drivers/hid/hid-wiimote-debug.c +++ b/drivers/hid/hid-wiimote-debug.c | |||
| @@ -23,12 +23,6 @@ struct wiimote_debug { | |||
| 23 | struct dentry *drm; | 23 | struct dentry *drm; |
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | static int wiidebug_eeprom_open(struct inode *i, struct file *f) | ||
| 27 | { | ||
| 28 | f->private_data = i->i_private; | ||
| 29 | return 0; | ||
| 30 | } | ||
| 31 | |||
| 32 | static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, | 26 | static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, |
| 33 | loff_t *off) | 27 | loff_t *off) |
| 34 | { | 28 | { |
| @@ -83,7 +77,7 @@ static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s, | |||
| 83 | 77 | ||
| 84 | static const struct file_operations wiidebug_eeprom_fops = { | 78 | static const struct file_operations wiidebug_eeprom_fops = { |
| 85 | .owner = THIS_MODULE, | 79 | .owner = THIS_MODULE, |
| 86 | .open = wiidebug_eeprom_open, | 80 | .open = simple_open, |
| 87 | .read = wiidebug_eeprom_read, | 81 | .read = wiidebug_eeprom_read, |
| 88 | .llseek = generic_file_llseek, | 82 | .llseek = generic_file_llseek, |
| 89 | }; | 83 | }; |
diff --git a/drivers/idle/i7300_idle.c b/drivers/idle/i7300_idle.c index c976285d313e..fa080ebd568f 100644 --- a/drivers/idle/i7300_idle.c +++ b/drivers/idle/i7300_idle.c | |||
| @@ -516,12 +516,6 @@ static struct notifier_block i7300_idle_nb = { | |||
| 516 | 516 | ||
| 517 | MODULE_DEVICE_TABLE(pci, pci_tbl); | 517 | MODULE_DEVICE_TABLE(pci, pci_tbl); |
| 518 | 518 | ||
| 519 | int stats_open_generic(struct inode *inode, struct file *fp) | ||
| 520 | { | ||
| 521 | fp->private_data = inode->i_private; | ||
| 522 | return 0; | ||
| 523 | } | ||
| 524 | |||
| 525 | static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, | 519 | static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, |
| 526 | loff_t *off) | 520 | loff_t *off) |
| 527 | { | 521 | { |
| @@ -534,7 +528,7 @@ static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, | |||
| 534 | } | 528 | } |
| 535 | 529 | ||
| 536 | static const struct file_operations idle_fops = { | 530 | static const struct file_operations idle_fops = { |
| 537 | .open = stats_open_generic, | 531 | .open = simple_open, |
| 538 | .read = stats_read_ul, | 532 | .read = stats_read_ul, |
| 539 | .llseek = default_llseek, | 533 | .llseek = default_llseek, |
| 540 | }; | 534 | }; |
diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c index 103dbd92e256..f55fc5dfbadc 100644 --- a/drivers/iommu/omap-iommu-debug.c +++ b/drivers/iommu/omap-iommu-debug.c | |||
| @@ -323,15 +323,9 @@ err_out: | |||
| 323 | return count; | 323 | return count; |
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | static int debug_open_generic(struct inode *inode, struct file *file) | ||
| 327 | { | ||
| 328 | file->private_data = inode->i_private; | ||
| 329 | return 0; | ||
| 330 | } | ||
| 331 | |||
| 332 | #define DEBUG_FOPS(name) \ | 326 | #define DEBUG_FOPS(name) \ |
| 333 | static const struct file_operations debug_##name##_fops = { \ | 327 | static const struct file_operations debug_##name##_fops = { \ |
| 334 | .open = debug_open_generic, \ | 328 | .open = simple_open, \ |
| 335 | .read = debug_read_##name, \ | 329 | .read = debug_read_##name, \ |
| 336 | .write = debug_write_##name, \ | 330 | .write = debug_write_##name, \ |
| 337 | .llseek = generic_file_llseek, \ | 331 | .llseek = generic_file_llseek, \ |
| @@ -339,7 +333,7 @@ static int debug_open_generic(struct inode *inode, struct file *file) | |||
| 339 | 333 | ||
| 340 | #define DEBUG_FOPS_RO(name) \ | 334 | #define DEBUG_FOPS_RO(name) \ |
| 341 | static const struct file_operations debug_##name##_fops = { \ | 335 | static const struct file_operations debug_##name##_fops = { \ |
| 342 | .open = debug_open_generic, \ | 336 | .open = simple_open, \ |
| 343 | .read = debug_read_##name, \ | 337 | .read = debug_read_##name, \ |
| 344 | .llseek = generic_file_llseek, \ | 338 | .llseek = generic_file_llseek, \ |
| 345 | }; | 339 | }; |
diff --git a/drivers/mfd/aat2870-core.c b/drivers/mfd/aat2870-core.c index 3aa36eb5c79b..44a3fdbadef4 100644 --- a/drivers/mfd/aat2870-core.c +++ b/drivers/mfd/aat2870-core.c | |||
| @@ -262,13 +262,6 @@ static ssize_t aat2870_dump_reg(struct aat2870_data *aat2870, char *buf) | |||
| 262 | return count; | 262 | return count; |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | static int aat2870_reg_open_file(struct inode *inode, struct file *file) | ||
| 266 | { | ||
| 267 | file->private_data = inode->i_private; | ||
| 268 | |||
| 269 | return 0; | ||
| 270 | } | ||
| 271 | |||
| 272 | static ssize_t aat2870_reg_read_file(struct file *file, char __user *user_buf, | 265 | static ssize_t aat2870_reg_read_file(struct file *file, char __user *user_buf, |
| 273 | size_t count, loff_t *ppos) | 266 | size_t count, loff_t *ppos) |
| 274 | { | 267 | { |
| @@ -330,7 +323,7 @@ static ssize_t aat2870_reg_write_file(struct file *file, | |||
| 330 | } | 323 | } |
| 331 | 324 | ||
| 332 | static const struct file_operations aat2870_reg_fops = { | 325 | static const struct file_operations aat2870_reg_fops = { |
| 333 | .open = aat2870_reg_open_file, | 326 | .open = simple_open, |
| 334 | .read = aat2870_reg_read_file, | 327 | .read = aat2870_reg_read_file, |
| 335 | .write = aat2870_reg_write_file, | 328 | .write = aat2870_reg_write_file, |
| 336 | }; | 329 | }; |
diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c index 60107ee166fc..1efad20fb175 100644 --- a/drivers/mfd/ab3100-core.c +++ b/drivers/mfd/ab3100-core.c | |||
| @@ -483,12 +483,6 @@ struct ab3100_get_set_reg_priv { | |||
| 483 | bool mode; | 483 | bool mode; |
| 484 | }; | 484 | }; |
| 485 | 485 | ||
| 486 | static int ab3100_get_set_reg_open_file(struct inode *inode, struct file *file) | ||
| 487 | { | ||
| 488 | file->private_data = inode->i_private; | ||
| 489 | return 0; | ||
| 490 | } | ||
| 491 | |||
| 492 | static ssize_t ab3100_get_set_reg(struct file *file, | 486 | static ssize_t ab3100_get_set_reg(struct file *file, |
| 493 | const char __user *user_buf, | 487 | const char __user *user_buf, |
| 494 | size_t count, loff_t *ppos) | 488 | size_t count, loff_t *ppos) |
| @@ -583,7 +577,7 @@ static ssize_t ab3100_get_set_reg(struct file *file, | |||
| 583 | } | 577 | } |
| 584 | 578 | ||
| 585 | static const struct file_operations ab3100_get_set_reg_fops = { | 579 | static const struct file_operations ab3100_get_set_reg_fops = { |
| 586 | .open = ab3100_get_set_reg_open_file, | 580 | .open = simple_open, |
| 587 | .write = ab3100_get_set_reg, | 581 | .write = ab3100_get_set_reg, |
| 588 | .llseek = noop_llseek, | 582 | .llseek = noop_llseek, |
| 589 | }; | 583 | }; |
diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c index 1c034b80d408..6673e578b3e9 100644 --- a/drivers/misc/ibmasm/ibmasmfs.c +++ b/drivers/misc/ibmasm/ibmasmfs.c | |||
| @@ -500,12 +500,6 @@ static ssize_t r_heartbeat_file_write(struct file *file, const char __user *buf, | |||
| 500 | return 1; | 500 | return 1; |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | static int remote_settings_file_open(struct inode *inode, struct file *file) | ||
| 504 | { | ||
| 505 | file->private_data = inode->i_private; | ||
| 506 | return 0; | ||
| 507 | } | ||
| 508 | |||
| 509 | static int remote_settings_file_close(struct inode *inode, struct file *file) | 503 | static int remote_settings_file_close(struct inode *inode, struct file *file) |
| 510 | { | 504 | { |
| 511 | return 0; | 505 | return 0; |
| @@ -600,7 +594,7 @@ static const struct file_operations r_heartbeat_fops = { | |||
| 600 | }; | 594 | }; |
| 601 | 595 | ||
| 602 | static const struct file_operations remote_settings_fops = { | 596 | static const struct file_operations remote_settings_fops = { |
| 603 | .open = remote_settings_file_open, | 597 | .open = simple_open, |
| 604 | .release = remote_settings_file_close, | 598 | .release = remote_settings_file_close, |
| 605 | .read = remote_settings_file_read, | 599 | .read = remote_settings_file_read, |
| 606 | .write = remote_settings_file_write, | 600 | .write = remote_settings_file_write, |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index eed213a5c8cb..b1809650b7aa 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -1623,24 +1623,6 @@ static int mmc_blk_alloc_parts(struct mmc_card *card, struct mmc_blk_data *md) | |||
| 1623 | return ret; | 1623 | return ret; |
| 1624 | } | 1624 | } |
| 1625 | 1625 | ||
| 1626 | static int | ||
| 1627 | mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card) | ||
| 1628 | { | ||
| 1629 | int err; | ||
| 1630 | |||
| 1631 | mmc_claim_host(card->host); | ||
| 1632 | err = mmc_set_blocklen(card, 512); | ||
| 1633 | mmc_release_host(card->host); | ||
| 1634 | |||
| 1635 | if (err) { | ||
| 1636 | pr_err("%s: unable to set block size to 512: %d\n", | ||
| 1637 | md->disk->disk_name, err); | ||
| 1638 | return -EINVAL; | ||
| 1639 | } | ||
| 1640 | |||
| 1641 | return 0; | ||
| 1642 | } | ||
| 1643 | |||
| 1644 | static void mmc_blk_remove_req(struct mmc_blk_data *md) | 1626 | static void mmc_blk_remove_req(struct mmc_blk_data *md) |
| 1645 | { | 1627 | { |
| 1646 | struct mmc_card *card; | 1628 | struct mmc_card *card; |
| @@ -1768,7 +1750,6 @@ static const struct mmc_fixup blk_fixups[] = | |||
| 1768 | static int mmc_blk_probe(struct mmc_card *card) | 1750 | static int mmc_blk_probe(struct mmc_card *card) |
| 1769 | { | 1751 | { |
| 1770 | struct mmc_blk_data *md, *part_md; | 1752 | struct mmc_blk_data *md, *part_md; |
| 1771 | int err; | ||
| 1772 | char cap_str[10]; | 1753 | char cap_str[10]; |
| 1773 | 1754 | ||
| 1774 | /* | 1755 | /* |
| @@ -1781,10 +1762,6 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
| 1781 | if (IS_ERR(md)) | 1762 | if (IS_ERR(md)) |
| 1782 | return PTR_ERR(md); | 1763 | return PTR_ERR(md); |
| 1783 | 1764 | ||
| 1784 | err = mmc_blk_set_blksize(md, card); | ||
| 1785 | if (err) | ||
| 1786 | goto out; | ||
| 1787 | |||
| 1788 | string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2, | 1765 | string_get_size((u64)get_capacity(md->disk) << 9, STRING_UNITS_2, |
| 1789 | cap_str, sizeof(cap_str)); | 1766 | cap_str, sizeof(cap_str)); |
| 1790 | pr_info("%s: %s %s %s %s\n", | 1767 | pr_info("%s: %s %s %s %s\n", |
| @@ -1809,7 +1786,7 @@ static int mmc_blk_probe(struct mmc_card *card) | |||
| 1809 | out: | 1786 | out: |
| 1810 | mmc_blk_remove_parts(card, md); | 1787 | mmc_blk_remove_parts(card, md); |
| 1811 | mmc_blk_remove_req(md); | 1788 | mmc_blk_remove_req(md); |
| 1812 | return err; | 1789 | return 0; |
| 1813 | } | 1790 | } |
| 1814 | 1791 | ||
| 1815 | static void mmc_blk_remove(struct mmc_card *card) | 1792 | static void mmc_blk_remove(struct mmc_card *card) |
| @@ -1845,8 +1822,6 @@ static int mmc_blk_resume(struct mmc_card *card) | |||
| 1845 | struct mmc_blk_data *md = mmc_get_drvdata(card); | 1822 | struct mmc_blk_data *md = mmc_get_drvdata(card); |
| 1846 | 1823 | ||
| 1847 | if (md) { | 1824 | if (md) { |
| 1848 | mmc_blk_set_blksize(md, card); | ||
| 1849 | |||
| 1850 | /* | 1825 | /* |
| 1851 | * Resume involves the card going into idle state, | 1826 | * Resume involves the card going into idle state, |
| 1852 | * so current partition is always the main one. | 1827 | * so current partition is always the main one. |
diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 5d011a39dfff..3f606068d552 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c | |||
| @@ -267,6 +267,15 @@ int mmc_add_card(struct mmc_card *card) | |||
| 267 | { | 267 | { |
| 268 | int ret; | 268 | int ret; |
| 269 | const char *type; | 269 | const char *type; |
| 270 | const char *uhs_bus_speed_mode = ""; | ||
| 271 | static const char *const uhs_speeds[] = { | ||
| 272 | [UHS_SDR12_BUS_SPEED] = "SDR12 ", | ||
| 273 | [UHS_SDR25_BUS_SPEED] = "SDR25 ", | ||
| 274 | [UHS_SDR50_BUS_SPEED] = "SDR50 ", | ||
| 275 | [UHS_SDR104_BUS_SPEED] = "SDR104 ", | ||
| 276 | [UHS_DDR50_BUS_SPEED] = "DDR50 ", | ||
| 277 | }; | ||
| 278 | |||
| 270 | 279 | ||
| 271 | dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca); | 280 | dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca); |
| 272 | 281 | ||
| @@ -296,6 +305,10 @@ int mmc_add_card(struct mmc_card *card) | |||
| 296 | break; | 305 | break; |
| 297 | } | 306 | } |
| 298 | 307 | ||
| 308 | if (mmc_sd_card_uhs(card) && | ||
| 309 | (card->sd_bus_speed < ARRAY_SIZE(uhs_speeds))) | ||
| 310 | uhs_bus_speed_mode = uhs_speeds[card->sd_bus_speed]; | ||
| 311 | |||
| 299 | if (mmc_host_is_spi(card->host)) { | 312 | if (mmc_host_is_spi(card->host)) { |
| 300 | pr_info("%s: new %s%s%s card on SPI\n", | 313 | pr_info("%s: new %s%s%s card on SPI\n", |
| 301 | mmc_hostname(card->host), | 314 | mmc_hostname(card->host), |
| @@ -303,13 +316,13 @@ int mmc_add_card(struct mmc_card *card) | |||
| 303 | mmc_card_ddr_mode(card) ? "DDR " : "", | 316 | mmc_card_ddr_mode(card) ? "DDR " : "", |
| 304 | type); | 317 | type); |
| 305 | } else { | 318 | } else { |
| 306 | pr_info("%s: new %s%s%s%s card at address %04x\n", | 319 | pr_info("%s: new %s%s%s%s%s card at address %04x\n", |
| 307 | mmc_hostname(card->host), | 320 | mmc_hostname(card->host), |
| 308 | mmc_card_uhs(card) ? "ultra high speed " : | 321 | mmc_card_uhs(card) ? "ultra high speed " : |
| 309 | (mmc_card_highspeed(card) ? "high speed " : ""), | 322 | (mmc_card_highspeed(card) ? "high speed " : ""), |
| 310 | (mmc_card_hs200(card) ? "HS200 " : ""), | 323 | (mmc_card_hs200(card) ? "HS200 " : ""), |
| 311 | mmc_card_ddr_mode(card) ? "DDR " : "", | 324 | mmc_card_ddr_mode(card) ? "DDR " : "", |
| 312 | type, card->rca); | 325 | uhs_bus_speed_mode, type, card->rca); |
| 313 | } | 326 | } |
| 314 | 327 | ||
| 315 | #ifdef CONFIG_DEBUG_FS | 328 | #ifdef CONFIG_DEBUG_FS |
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 14f262e9246d..7474c47b9c08 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -527,10 +527,14 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card) | |||
| 527 | 527 | ||
| 528 | if (data->flags & MMC_DATA_WRITE) | 528 | if (data->flags & MMC_DATA_WRITE) |
| 529 | /* | 529 | /* |
| 530 | * The limit is really 250 ms, but that is | 530 | * The MMC spec "It is strongly recommended |
| 531 | * insufficient for some crappy cards. | 531 | * for hosts to implement more than 500ms |
| 532 | * timeout value even if the card indicates | ||
| 533 | * the 250ms maximum busy length." Even the | ||
| 534 | * previous value of 300ms is known to be | ||
| 535 | * insufficient for some cards. | ||
| 532 | */ | 536 | */ |
| 533 | limit_us = 300000; | 537 | limit_us = 3000000; |
| 534 | else | 538 | else |
| 535 | limit_us = 100000; | 539 | limit_us = 100000; |
| 536 | 540 | ||
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 02914d609a91..54df5adc0413 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
| @@ -695,6 +695,11 @@ static int mmc_select_powerclass(struct mmc_card *card, | |||
| 695 | else if (host->ios.clock <= 200000000) | 695 | else if (host->ios.clock <= 200000000) |
| 696 | index = EXT_CSD_PWR_CL_200_195; | 696 | index = EXT_CSD_PWR_CL_200_195; |
| 697 | break; | 697 | break; |
| 698 | case MMC_VDD_27_28: | ||
| 699 | case MMC_VDD_28_29: | ||
| 700 | case MMC_VDD_29_30: | ||
| 701 | case MMC_VDD_30_31: | ||
| 702 | case MMC_VDD_31_32: | ||
| 698 | case MMC_VDD_32_33: | 703 | case MMC_VDD_32_33: |
| 699 | case MMC_VDD_33_34: | 704 | case MMC_VDD_33_34: |
| 700 | case MMC_VDD_34_35: | 705 | case MMC_VDD_34_35: |
| @@ -1111,11 +1116,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 1111 | ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? | 1116 | ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? |
| 1112 | EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; | 1117 | EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; |
| 1113 | err = mmc_select_powerclass(card, ext_csd_bits, ext_csd); | 1118 | err = mmc_select_powerclass(card, ext_csd_bits, ext_csd); |
| 1114 | if (err) { | 1119 | if (err) |
| 1115 | pr_err("%s: power class selection to bus width %d failed\n", | 1120 | pr_warning("%s: power class selection to bus width %d" |
| 1116 | mmc_hostname(card->host), 1 << bus_width); | 1121 | " failed\n", mmc_hostname(card->host), |
| 1117 | goto err; | 1122 | 1 << bus_width); |
| 1118 | } | ||
| 1119 | } | 1123 | } |
| 1120 | 1124 | ||
| 1121 | /* | 1125 | /* |
| @@ -1147,10 +1151,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 1147 | err = mmc_select_powerclass(card, ext_csd_bits[idx][0], | 1151 | err = mmc_select_powerclass(card, ext_csd_bits[idx][0], |
| 1148 | ext_csd); | 1152 | ext_csd); |
| 1149 | if (err) | 1153 | if (err) |
| 1150 | pr_err("%s: power class selection to " | 1154 | pr_warning("%s: power class selection to " |
| 1151 | "bus width %d failed\n", | 1155 | "bus width %d failed\n", |
| 1152 | mmc_hostname(card->host), | 1156 | mmc_hostname(card->host), |
| 1153 | 1 << bus_width); | 1157 | 1 << bus_width); |
| 1154 | 1158 | ||
| 1155 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1159 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
| 1156 | EXT_CSD_BUS_WIDTH, | 1160 | EXT_CSD_BUS_WIDTH, |
| @@ -1178,10 +1182,10 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 1178 | err = mmc_select_powerclass(card, ext_csd_bits[idx][1], | 1182 | err = mmc_select_powerclass(card, ext_csd_bits[idx][1], |
| 1179 | ext_csd); | 1183 | ext_csd); |
| 1180 | if (err) | 1184 | if (err) |
| 1181 | pr_err("%s: power class selection to " | 1185 | pr_warning("%s: power class selection to " |
| 1182 | "bus width %d ddr %d failed\n", | 1186 | "bus width %d ddr %d failed\n", |
| 1183 | mmc_hostname(card->host), | 1187 | mmc_hostname(card->host), |
| 1184 | 1 << bus_width, ddr); | 1188 | 1 << bus_width, ddr); |
| 1185 | 1189 | ||
| 1186 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | 1190 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, |
| 1187 | EXT_CSD_BUS_WIDTH, | 1191 | EXT_CSD_BUS_WIDTH, |
diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index 40989e6bb53a..236842ec955a 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c | |||
| @@ -192,9 +192,15 @@ static int sdio_bus_remove(struct device *dev) | |||
| 192 | return ret; | 192 | return ret; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | #ifdef CONFIG_PM_RUNTIME | 195 | #ifdef CONFIG_PM |
| 196 | |||
| 197 | static int pm_no_operation(struct device *dev) | ||
| 198 | { | ||
| 199 | return 0; | ||
| 200 | } | ||
| 196 | 201 | ||
| 197 | static const struct dev_pm_ops sdio_bus_pm_ops = { | 202 | static const struct dev_pm_ops sdio_bus_pm_ops = { |
| 203 | SET_SYSTEM_SLEEP_PM_OPS(pm_no_operation, pm_no_operation) | ||
| 198 | SET_RUNTIME_PM_OPS( | 204 | SET_RUNTIME_PM_OPS( |
| 199 | pm_generic_runtime_suspend, | 205 | pm_generic_runtime_suspend, |
| 200 | pm_generic_runtime_resume, | 206 | pm_generic_runtime_resume, |
| @@ -204,11 +210,11 @@ static const struct dev_pm_ops sdio_bus_pm_ops = { | |||
| 204 | 210 | ||
| 205 | #define SDIO_PM_OPS_PTR (&sdio_bus_pm_ops) | 211 | #define SDIO_PM_OPS_PTR (&sdio_bus_pm_ops) |
| 206 | 212 | ||
| 207 | #else /* !CONFIG_PM_RUNTIME */ | 213 | #else /* !CONFIG_PM */ |
| 208 | 214 | ||
| 209 | #define SDIO_PM_OPS_PTR NULL | 215 | #define SDIO_PM_OPS_PTR NULL |
| 210 | 216 | ||
| 211 | #endif /* !CONFIG_PM_RUNTIME */ | 217 | #endif /* !CONFIG_PM */ |
| 212 | 218 | ||
| 213 | static struct bus_type sdio_bus_type = { | 219 | static struct bus_type sdio_bus_type = { |
| 214 | .name = "sdio", | 220 | .name = "sdio", |
diff --git a/drivers/mmc/host/atmel-mci-regs.h b/drivers/mmc/host/atmel-mci-regs.h index 000b3ad0f5ca..787aba1682bb 100644 --- a/drivers/mmc/host/atmel-mci-regs.h +++ b/drivers/mmc/host/atmel-mci-regs.h | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | # define ATMCI_MR_PDCFBYTE ( 1 << 13) /* Force Byte Transfer */ | 31 | # define ATMCI_MR_PDCFBYTE ( 1 << 13) /* Force Byte Transfer */ |
| 32 | # define ATMCI_MR_PDCPADV ( 1 << 14) /* Padding Value */ | 32 | # define ATMCI_MR_PDCPADV ( 1 << 14) /* Padding Value */ |
| 33 | # define ATMCI_MR_PDCMODE ( 1 << 15) /* PDC-oriented Mode */ | 33 | # define ATMCI_MR_PDCMODE ( 1 << 15) /* PDC-oriented Mode */ |
| 34 | # define ATMCI_MR_CLKODD(x) ((x) << 16) /* LSB of Clock Divider */ | ||
| 34 | #define ATMCI_DTOR 0x0008 /* Data Timeout */ | 35 | #define ATMCI_DTOR 0x0008 /* Data Timeout */ |
| 35 | # define ATMCI_DTOCYC(x) ((x) << 0) /* Data Timeout Cycles */ | 36 | # define ATMCI_DTOCYC(x) ((x) << 0) /* Data Timeout Cycles */ |
| 36 | # define ATMCI_DTOMUL(x) ((x) << 4) /* Data Timeout Multiplier */ | 37 | # define ATMCI_DTOMUL(x) ((x) << 4) /* Data Timeout Multiplier */ |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 9819dc09ce08..e94476beca18 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -77,6 +77,7 @@ struct atmel_mci_caps { | |||
| 77 | bool has_cstor_reg; | 77 | bool has_cstor_reg; |
| 78 | bool has_highspeed; | 78 | bool has_highspeed; |
| 79 | bool has_rwproof; | 79 | bool has_rwproof; |
| 80 | bool has_odd_clk_div; | ||
| 80 | }; | 81 | }; |
| 81 | 82 | ||
| 82 | struct atmel_mci_dma { | 83 | struct atmel_mci_dma { |
| @@ -482,7 +483,14 @@ err: | |||
| 482 | static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host, | 483 | static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host, |
| 483 | unsigned int ns) | 484 | unsigned int ns) |
| 484 | { | 485 | { |
| 485 | return (ns * (host->bus_hz / 1000000) + 999) / 1000; | 486 | /* |
| 487 | * It is easier here to use us instead of ns for the timeout, | ||
| 488 | * it prevents from overflows during calculation. | ||
| 489 | */ | ||
| 490 | unsigned int us = DIV_ROUND_UP(ns, 1000); | ||
| 491 | |||
| 492 | /* Maximum clock frequency is host->bus_hz/2 */ | ||
| 493 | return us * (DIV_ROUND_UP(host->bus_hz, 2000000)); | ||
| 486 | } | 494 | } |
| 487 | 495 | ||
| 488 | static void atmci_set_timeout(struct atmel_mci *host, | 496 | static void atmci_set_timeout(struct atmel_mci *host, |
| @@ -1127,16 +1135,27 @@ static void atmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 1127 | } | 1135 | } |
| 1128 | 1136 | ||
| 1129 | /* Calculate clock divider */ | 1137 | /* Calculate clock divider */ |
| 1130 | clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1; | 1138 | if (host->caps.has_odd_clk_div) { |
| 1131 | if (clkdiv > 255) { | 1139 | clkdiv = DIV_ROUND_UP(host->bus_hz, clock_min) - 2; |
| 1132 | dev_warn(&mmc->class_dev, | 1140 | if (clkdiv > 511) { |
| 1133 | "clock %u too slow; using %lu\n", | 1141 | dev_warn(&mmc->class_dev, |
| 1134 | clock_min, host->bus_hz / (2 * 256)); | 1142 | "clock %u too slow; using %lu\n", |
| 1135 | clkdiv = 255; | 1143 | clock_min, host->bus_hz / (511 + 2)); |
| 1144 | clkdiv = 511; | ||
| 1145 | } | ||
| 1146 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv >> 1) | ||
| 1147 | | ATMCI_MR_CLKODD(clkdiv & 1); | ||
| 1148 | } else { | ||
| 1149 | clkdiv = DIV_ROUND_UP(host->bus_hz, 2 * clock_min) - 1; | ||
| 1150 | if (clkdiv > 255) { | ||
| 1151 | dev_warn(&mmc->class_dev, | ||
| 1152 | "clock %u too slow; using %lu\n", | ||
| 1153 | clock_min, host->bus_hz / (2 * 256)); | ||
| 1154 | clkdiv = 255; | ||
| 1155 | } | ||
| 1156 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv); | ||
| 1136 | } | 1157 | } |
| 1137 | 1158 | ||
| 1138 | host->mode_reg = ATMCI_MR_CLKDIV(clkdiv); | ||
| 1139 | |||
| 1140 | /* | 1159 | /* |
| 1141 | * WRPROOF and RDPROOF prevent overruns/underruns by | 1160 | * WRPROOF and RDPROOF prevent overruns/underruns by |
| 1142 | * stopping the clock when the FIFO is full/empty. | 1161 | * stopping the clock when the FIFO is full/empty. |
| @@ -2007,35 +2026,35 @@ static void __init atmci_get_cap(struct atmel_mci *host) | |||
| 2007 | "version: 0x%x\n", version); | 2026 | "version: 0x%x\n", version); |
| 2008 | 2027 | ||
| 2009 | host->caps.has_dma = 0; | 2028 | host->caps.has_dma = 0; |
| 2010 | host->caps.has_pdc = 0; | 2029 | host->caps.has_pdc = 1; |
| 2011 | host->caps.has_cfg_reg = 0; | 2030 | host->caps.has_cfg_reg = 0; |
| 2012 | host->caps.has_cstor_reg = 0; | 2031 | host->caps.has_cstor_reg = 0; |
| 2013 | host->caps.has_highspeed = 0; | 2032 | host->caps.has_highspeed = 0; |
| 2014 | host->caps.has_rwproof = 0; | 2033 | host->caps.has_rwproof = 0; |
| 2034 | host->caps.has_odd_clk_div = 0; | ||
| 2015 | 2035 | ||
| 2016 | /* keep only major version number */ | 2036 | /* keep only major version number */ |
| 2017 | switch (version & 0xf00) { | 2037 | switch (version & 0xf00) { |
| 2018 | case 0x100: | ||
| 2019 | case 0x200: | ||
| 2020 | host->caps.has_pdc = 1; | ||
| 2021 | host->caps.has_rwproof = 1; | ||
| 2022 | break; | ||
| 2023 | case 0x300: | ||
| 2024 | case 0x400: | ||
| 2025 | case 0x500: | 2038 | case 0x500: |
| 2039 | host->caps.has_odd_clk_div = 1; | ||
| 2040 | case 0x400: | ||
| 2041 | case 0x300: | ||
| 2026 | #ifdef CONFIG_AT_HDMAC | 2042 | #ifdef CONFIG_AT_HDMAC |
| 2027 | host->caps.has_dma = 1; | 2043 | host->caps.has_dma = 1; |
| 2028 | #else | 2044 | #else |
| 2029 | host->caps.has_dma = 0; | ||
| 2030 | dev_info(&host->pdev->dev, | 2045 | dev_info(&host->pdev->dev, |
| 2031 | "has dma capability but dma engine is not selected, then use pio\n"); | 2046 | "has dma capability but dma engine is not selected, then use pio\n"); |
| 2032 | #endif | 2047 | #endif |
| 2048 | host->caps.has_pdc = 0; | ||
| 2033 | host->caps.has_cfg_reg = 1; | 2049 | host->caps.has_cfg_reg = 1; |
| 2034 | host->caps.has_cstor_reg = 1; | 2050 | host->caps.has_cstor_reg = 1; |
| 2035 | host->caps.has_highspeed = 1; | 2051 | host->caps.has_highspeed = 1; |
| 2052 | case 0x200: | ||
| 2036 | host->caps.has_rwproof = 1; | 2053 | host->caps.has_rwproof = 1; |
| 2054 | case 0x100: | ||
| 2037 | break; | 2055 | break; |
| 2038 | default: | 2056 | default: |
| 2057 | host->caps.has_pdc = 0; | ||
| 2039 | dev_warn(&host->pdev->dev, | 2058 | dev_warn(&host->pdev->dev, |
| 2040 | "Unmanaged mci version, set minimum capabilities\n"); | 2059 | "Unmanaged mci version, set minimum capabilities\n"); |
| 2041 | break; | 2060 | break; |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 47adb161d3ad..5c2b1c10af9c 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -1785,7 +1785,7 @@ static inline struct omap_mmc_platform_data | |||
| 1785 | } | 1785 | } |
| 1786 | #endif | 1786 | #endif |
| 1787 | 1787 | ||
| 1788 | static int __init omap_hsmmc_probe(struct platform_device *pdev) | 1788 | static int __devinit omap_hsmmc_probe(struct platform_device *pdev) |
| 1789 | { | 1789 | { |
| 1790 | struct omap_mmc_platform_data *pdata = pdev->dev.platform_data; | 1790 | struct omap_mmc_platform_data *pdata = pdev->dev.platform_data; |
| 1791 | struct mmc_host *mmc; | 1791 | struct mmc_host *mmc; |
| @@ -1818,8 +1818,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1818 | if (res == NULL || irq < 0) | 1818 | if (res == NULL || irq < 0) |
| 1819 | return -ENXIO; | 1819 | return -ENXIO; |
| 1820 | 1820 | ||
| 1821 | res->start += pdata->reg_offset; | ||
| 1822 | res->end += pdata->reg_offset; | ||
| 1823 | res = request_mem_region(res->start, resource_size(res), pdev->name); | 1821 | res = request_mem_region(res->start, resource_size(res), pdev->name); |
| 1824 | if (res == NULL) | 1822 | if (res == NULL) |
| 1825 | return -EBUSY; | 1823 | return -EBUSY; |
| @@ -1843,7 +1841,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1843 | host->dma_ch = -1; | 1841 | host->dma_ch = -1; |
| 1844 | host->irq = irq; | 1842 | host->irq = irq; |
| 1845 | host->slot_id = 0; | 1843 | host->slot_id = 0; |
| 1846 | host->mapbase = res->start; | 1844 | host->mapbase = res->start + pdata->reg_offset; |
| 1847 | host->base = ioremap(host->mapbase, SZ_4K); | 1845 | host->base = ioremap(host->mapbase, SZ_4K); |
| 1848 | host->power_mode = MMC_POWER_OFF; | 1846 | host->power_mode = MMC_POWER_OFF; |
| 1849 | host->next_data.cookie = 1; | 1847 | host->next_data.cookie = 1; |
| @@ -1875,8 +1873,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1875 | goto err1; | 1873 | goto err1; |
| 1876 | } | 1874 | } |
| 1877 | 1875 | ||
| 1878 | omap_hsmmc_context_save(host); | ||
| 1879 | |||
| 1880 | if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { | 1876 | if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) { |
| 1881 | dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); | 1877 | dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n"); |
| 1882 | mmc->caps2 |= MMC_CAP2_NO_MULTI_READ; | 1878 | mmc->caps2 |= MMC_CAP2_NO_MULTI_READ; |
| @@ -1887,6 +1883,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1887 | pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY); | 1883 | pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY); |
| 1888 | pm_runtime_use_autosuspend(host->dev); | 1884 | pm_runtime_use_autosuspend(host->dev); |
| 1889 | 1885 | ||
| 1886 | omap_hsmmc_context_save(host); | ||
| 1887 | |||
| 1890 | if (cpu_is_omap2430()) { | 1888 | if (cpu_is_omap2430()) { |
| 1891 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); | 1889 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); |
| 1892 | /* | 1890 | /* |
| @@ -2018,8 +2016,7 @@ err_reg: | |||
| 2018 | err_irq_cd_init: | 2016 | err_irq_cd_init: |
| 2019 | free_irq(host->irq, host); | 2017 | free_irq(host->irq, host); |
| 2020 | err_irq: | 2018 | err_irq: |
| 2021 | pm_runtime_mark_last_busy(host->dev); | 2019 | pm_runtime_put_sync(host->dev); |
| 2022 | pm_runtime_put_autosuspend(host->dev); | ||
| 2023 | pm_runtime_disable(host->dev); | 2020 | pm_runtime_disable(host->dev); |
| 2024 | clk_put(host->fclk); | 2021 | clk_put(host->fclk); |
| 2025 | if (host->got_dbclk) { | 2022 | if (host->got_dbclk) { |
| @@ -2037,35 +2034,33 @@ err: | |||
| 2037 | return ret; | 2034 | return ret; |
| 2038 | } | 2035 | } |
| 2039 | 2036 | ||
| 2040 | static int omap_hsmmc_remove(struct platform_device *pdev) | 2037 | static int __devexit omap_hsmmc_remove(struct platform_device *pdev) |
| 2041 | { | 2038 | { |
| 2042 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | 2039 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); |
| 2043 | struct resource *res; | 2040 | struct resource *res; |
| 2044 | 2041 | ||
| 2045 | if (host) { | 2042 | pm_runtime_get_sync(host->dev); |
| 2046 | pm_runtime_get_sync(host->dev); | 2043 | mmc_remove_host(host->mmc); |
| 2047 | mmc_remove_host(host->mmc); | 2044 | if (host->use_reg) |
| 2048 | if (host->use_reg) | 2045 | omap_hsmmc_reg_put(host); |
| 2049 | omap_hsmmc_reg_put(host); | 2046 | if (host->pdata->cleanup) |
| 2050 | if (host->pdata->cleanup) | 2047 | host->pdata->cleanup(&pdev->dev); |
| 2051 | host->pdata->cleanup(&pdev->dev); | 2048 | free_irq(host->irq, host); |
| 2052 | free_irq(host->irq, host); | 2049 | if (mmc_slot(host).card_detect_irq) |
| 2053 | if (mmc_slot(host).card_detect_irq) | 2050 | free_irq(mmc_slot(host).card_detect_irq, host); |
| 2054 | free_irq(mmc_slot(host).card_detect_irq, host); | ||
| 2055 | |||
| 2056 | pm_runtime_put_sync(host->dev); | ||
| 2057 | pm_runtime_disable(host->dev); | ||
| 2058 | clk_put(host->fclk); | ||
| 2059 | if (host->got_dbclk) { | ||
| 2060 | clk_disable(host->dbclk); | ||
| 2061 | clk_put(host->dbclk); | ||
| 2062 | } | ||
| 2063 | 2051 | ||
| 2064 | mmc_free_host(host->mmc); | 2052 | pm_runtime_put_sync(host->dev); |
| 2065 | iounmap(host->base); | 2053 | pm_runtime_disable(host->dev); |
| 2066 | omap_hsmmc_gpio_free(pdev->dev.platform_data); | 2054 | clk_put(host->fclk); |
| 2055 | if (host->got_dbclk) { | ||
| 2056 | clk_disable(host->dbclk); | ||
| 2057 | clk_put(host->dbclk); | ||
| 2067 | } | 2058 | } |
| 2068 | 2059 | ||
| 2060 | mmc_free_host(host->mmc); | ||
| 2061 | iounmap(host->base); | ||
| 2062 | omap_hsmmc_gpio_free(pdev->dev.platform_data); | ||
| 2063 | |||
| 2069 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2064 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2070 | if (res) | 2065 | if (res) |
| 2071 | release_mem_region(res->start, resource_size(res)); | 2066 | release_mem_region(res->start, resource_size(res)); |
| @@ -2078,49 +2073,45 @@ static int omap_hsmmc_remove(struct platform_device *pdev) | |||
| 2078 | static int omap_hsmmc_suspend(struct device *dev) | 2073 | static int omap_hsmmc_suspend(struct device *dev) |
| 2079 | { | 2074 | { |
| 2080 | int ret = 0; | 2075 | int ret = 0; |
| 2081 | struct platform_device *pdev = to_platform_device(dev); | 2076 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 2082 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | ||
| 2083 | 2077 | ||
| 2084 | if (host && host->suspended) | 2078 | if (!host) |
| 2085 | return 0; | 2079 | return 0; |
| 2086 | 2080 | ||
| 2087 | if (host) { | 2081 | if (host && host->suspended) |
| 2088 | pm_runtime_get_sync(host->dev); | 2082 | return 0; |
| 2089 | host->suspended = 1; | ||
| 2090 | if (host->pdata->suspend) { | ||
| 2091 | ret = host->pdata->suspend(&pdev->dev, | ||
| 2092 | host->slot_id); | ||
| 2093 | if (ret) { | ||
| 2094 | dev_dbg(mmc_dev(host->mmc), | ||
| 2095 | "Unable to handle MMC board" | ||
| 2096 | " level suspend\n"); | ||
| 2097 | host->suspended = 0; | ||
| 2098 | return ret; | ||
| 2099 | } | ||
| 2100 | } | ||
| 2101 | ret = mmc_suspend_host(host->mmc); | ||
| 2102 | 2083 | ||
| 2084 | pm_runtime_get_sync(host->dev); | ||
| 2085 | host->suspended = 1; | ||
| 2086 | if (host->pdata->suspend) { | ||
| 2087 | ret = host->pdata->suspend(dev, host->slot_id); | ||
| 2103 | if (ret) { | 2088 | if (ret) { |
| 2089 | dev_dbg(dev, "Unable to handle MMC board" | ||
| 2090 | " level suspend\n"); | ||
| 2104 | host->suspended = 0; | 2091 | host->suspended = 0; |
| 2105 | if (host->pdata->resume) { | 2092 | return ret; |
| 2106 | ret = host->pdata->resume(&pdev->dev, | ||
| 2107 | host->slot_id); | ||
| 2108 | if (ret) | ||
| 2109 | dev_dbg(mmc_dev(host->mmc), | ||
| 2110 | "Unmask interrupt failed\n"); | ||
| 2111 | } | ||
| 2112 | goto err; | ||
| 2113 | } | 2093 | } |
| 2094 | } | ||
| 2095 | ret = mmc_suspend_host(host->mmc); | ||
| 2114 | 2096 | ||
| 2115 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) { | 2097 | if (ret) { |
| 2116 | omap_hsmmc_disable_irq(host); | 2098 | host->suspended = 0; |
| 2117 | OMAP_HSMMC_WRITE(host->base, HCTL, | 2099 | if (host->pdata->resume) { |
| 2118 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); | 2100 | ret = host->pdata->resume(dev, host->slot_id); |
| 2101 | if (ret) | ||
| 2102 | dev_dbg(dev, "Unmask interrupt failed\n"); | ||
| 2119 | } | 2103 | } |
| 2120 | if (host->got_dbclk) | 2104 | goto err; |
| 2121 | clk_disable(host->dbclk); | 2105 | } |
| 2122 | 2106 | ||
| 2107 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) { | ||
| 2108 | omap_hsmmc_disable_irq(host); | ||
| 2109 | OMAP_HSMMC_WRITE(host->base, HCTL, | ||
| 2110 | OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); | ||
| 2123 | } | 2111 | } |
| 2112 | |||
| 2113 | if (host->got_dbclk) | ||
| 2114 | clk_disable(host->dbclk); | ||
| 2124 | err: | 2115 | err: |
| 2125 | pm_runtime_put_sync(host->dev); | 2116 | pm_runtime_put_sync(host->dev); |
| 2126 | return ret; | 2117 | return ret; |
| @@ -2130,38 +2121,37 @@ err: | |||
| 2130 | static int omap_hsmmc_resume(struct device *dev) | 2121 | static int omap_hsmmc_resume(struct device *dev) |
| 2131 | { | 2122 | { |
| 2132 | int ret = 0; | 2123 | int ret = 0; |
| 2133 | struct platform_device *pdev = to_platform_device(dev); | 2124 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 2134 | struct omap_hsmmc_host *host = platform_get_drvdata(pdev); | 2125 | |
| 2126 | if (!host) | ||
| 2127 | return 0; | ||
| 2135 | 2128 | ||
| 2136 | if (host && !host->suspended) | 2129 | if (host && !host->suspended) |
| 2137 | return 0; | 2130 | return 0; |
| 2138 | 2131 | ||
| 2139 | if (host) { | 2132 | pm_runtime_get_sync(host->dev); |
| 2140 | pm_runtime_get_sync(host->dev); | ||
| 2141 | 2133 | ||
| 2142 | if (host->got_dbclk) | 2134 | if (host->got_dbclk) |
| 2143 | clk_enable(host->dbclk); | 2135 | clk_enable(host->dbclk); |
| 2144 | 2136 | ||
| 2145 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) | 2137 | if (!(host->mmc->pm_flags & MMC_PM_KEEP_POWER)) |
| 2146 | omap_hsmmc_conf_bus_power(host); | 2138 | omap_hsmmc_conf_bus_power(host); |
| 2147 | 2139 | ||
| 2148 | if (host->pdata->resume) { | 2140 | if (host->pdata->resume) { |
| 2149 | ret = host->pdata->resume(&pdev->dev, host->slot_id); | 2141 | ret = host->pdata->resume(dev, host->slot_id); |
| 2150 | if (ret) | 2142 | if (ret) |
| 2151 | dev_dbg(mmc_dev(host->mmc), | 2143 | dev_dbg(dev, "Unmask interrupt failed\n"); |
| 2152 | "Unmask interrupt failed\n"); | 2144 | } |
| 2153 | } | ||
| 2154 | 2145 | ||
| 2155 | omap_hsmmc_protect_card(host); | 2146 | omap_hsmmc_protect_card(host); |
| 2156 | 2147 | ||
| 2157 | /* Notify the core to resume the host */ | 2148 | /* Notify the core to resume the host */ |
| 2158 | ret = mmc_resume_host(host->mmc); | 2149 | ret = mmc_resume_host(host->mmc); |
| 2159 | if (ret == 0) | 2150 | if (ret == 0) |
| 2160 | host->suspended = 0; | 2151 | host->suspended = 0; |
| 2161 | 2152 | ||
| 2162 | pm_runtime_mark_last_busy(host->dev); | 2153 | pm_runtime_mark_last_busy(host->dev); |
| 2163 | pm_runtime_put_autosuspend(host->dev); | 2154 | pm_runtime_put_autosuspend(host->dev); |
| 2164 | } | ||
| 2165 | 2155 | ||
| 2166 | return ret; | 2156 | return ret; |
| 2167 | 2157 | ||
| @@ -2178,7 +2168,7 @@ static int omap_hsmmc_runtime_suspend(struct device *dev) | |||
| 2178 | 2168 | ||
| 2179 | host = platform_get_drvdata(to_platform_device(dev)); | 2169 | host = platform_get_drvdata(to_platform_device(dev)); |
| 2180 | omap_hsmmc_context_save(host); | 2170 | omap_hsmmc_context_save(host); |
| 2181 | dev_dbg(mmc_dev(host->mmc), "disabled\n"); | 2171 | dev_dbg(dev, "disabled\n"); |
| 2182 | 2172 | ||
| 2183 | return 0; | 2173 | return 0; |
| 2184 | } | 2174 | } |
| @@ -2189,7 +2179,7 @@ static int omap_hsmmc_runtime_resume(struct device *dev) | |||
| 2189 | 2179 | ||
| 2190 | host = platform_get_drvdata(to_platform_device(dev)); | 2180 | host = platform_get_drvdata(to_platform_device(dev)); |
| 2191 | omap_hsmmc_context_restore(host); | 2181 | omap_hsmmc_context_restore(host); |
| 2192 | dev_dbg(mmc_dev(host->mmc), "enabled\n"); | 2182 | dev_dbg(dev, "enabled\n"); |
| 2193 | 2183 | ||
| 2194 | return 0; | 2184 | return 0; |
| 2195 | } | 2185 | } |
| @@ -2202,7 +2192,8 @@ static struct dev_pm_ops omap_hsmmc_dev_pm_ops = { | |||
| 2202 | }; | 2192 | }; |
| 2203 | 2193 | ||
| 2204 | static struct platform_driver omap_hsmmc_driver = { | 2194 | static struct platform_driver omap_hsmmc_driver = { |
| 2205 | .remove = omap_hsmmc_remove, | 2195 | .probe = omap_hsmmc_probe, |
| 2196 | .remove = __devexit_p(omap_hsmmc_remove), | ||
| 2206 | .driver = { | 2197 | .driver = { |
| 2207 | .name = DRIVER_NAME, | 2198 | .name = DRIVER_NAME, |
| 2208 | .owner = THIS_MODULE, | 2199 | .owner = THIS_MODULE, |
| @@ -2211,21 +2202,7 @@ static struct platform_driver omap_hsmmc_driver = { | |||
| 2211 | }, | 2202 | }, |
| 2212 | }; | 2203 | }; |
| 2213 | 2204 | ||
| 2214 | static int __init omap_hsmmc_init(void) | 2205 | module_platform_driver(omap_hsmmc_driver); |
| 2215 | { | ||
| 2216 | /* Register the MMC driver */ | ||
| 2217 | return platform_driver_probe(&omap_hsmmc_driver, omap_hsmmc_probe); | ||
| 2218 | } | ||
| 2219 | |||
| 2220 | static void __exit omap_hsmmc_cleanup(void) | ||
| 2221 | { | ||
| 2222 | /* Unregister MMC driver */ | ||
| 2223 | platform_driver_unregister(&omap_hsmmc_driver); | ||
| 2224 | } | ||
| 2225 | |||
| 2226 | module_init(omap_hsmmc_init); | ||
| 2227 | module_exit(omap_hsmmc_cleanup); | ||
| 2228 | |||
| 2229 | MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver"); | 2206 | MODULE_DESCRIPTION("OMAP High Speed Multimedia Card driver"); |
| 2230 | MODULE_LICENSE("GPL"); | 2207 | MODULE_LICENSE("GPL"); |
| 2231 | MODULE_ALIAS("platform:" DRIVER_NAME); | 2208 | MODULE_ALIAS("platform:" DRIVER_NAME); |
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index 46fd1fd1b605..177f697b5835 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
| 23 | #include <linux/module.h> | ||
| 23 | #include <linux/mmc/host.h> | 24 | #include <linux/mmc/host.h> |
| 24 | 25 | ||
| 25 | #include "sdhci-pltfm.h" | 26 | #include "sdhci-pltfm.h" |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index fbbebe251e01..69ef0beae104 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -1418,8 +1418,6 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
| 1418 | 1418 | ||
| 1419 | slots = chip->num_slots; /* Quirk may have changed this */ | 1419 | slots = chip->num_slots; /* Quirk may have changed this */ |
| 1420 | 1420 | ||
| 1421 | pci_enable_msi(pdev); | ||
| 1422 | |||
| 1423 | for (i = 0; i < slots; i++) { | 1421 | for (i = 0; i < slots; i++) { |
| 1424 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar, i); | 1422 | slot = sdhci_pci_probe_slot(pdev, chip, first_bar, i); |
| 1425 | if (IS_ERR(slot)) { | 1423 | if (IS_ERR(slot)) { |
| @@ -1438,8 +1436,6 @@ static int __devinit sdhci_pci_probe(struct pci_dev *pdev, | |||
| 1438 | return 0; | 1436 | return 0; |
| 1439 | 1437 | ||
| 1440 | free: | 1438 | free: |
| 1441 | pci_disable_msi(pdev); | ||
| 1442 | |||
| 1443 | pci_set_drvdata(pdev, NULL); | 1439 | pci_set_drvdata(pdev, NULL); |
| 1444 | kfree(chip); | 1440 | kfree(chip); |
| 1445 | 1441 | ||
| @@ -1462,8 +1458,6 @@ static void __devexit sdhci_pci_remove(struct pci_dev *pdev) | |||
| 1462 | for (i = 0; i < chip->num_slots; i++) | 1458 | for (i = 0; i < chip->num_slots; i++) |
| 1463 | sdhci_pci_remove_slot(chip->slots[i]); | 1459 | sdhci_pci_remove_slot(chip->slots[i]); |
| 1464 | 1460 | ||
| 1465 | pci_disable_msi(pdev); | ||
| 1466 | |||
| 1467 | pci_set_drvdata(pdev, NULL); | 1461 | pci_set_drvdata(pdev, NULL); |
| 1468 | kfree(chip); | 1462 | kfree(chip); |
| 1469 | } | 1463 | } |
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index b19e7d435f8d..55a164fcaa15 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -20,6 +20,10 @@ | |||
| 20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
| 21 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
| 22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
| 23 | #include <linux/of.h> | ||
| 24 | #include <linux/of_gpio.h> | ||
| 25 | #include <linux/pm.h> | ||
| 26 | #include <linux/pm_runtime.h> | ||
| 23 | 27 | ||
| 24 | #include <linux/mmc/host.h> | 28 | #include <linux/mmc/host.h> |
| 25 | 29 | ||
| @@ -53,6 +57,18 @@ struct sdhci_s3c { | |||
| 53 | struct clk *clk_bus[MAX_BUS_CLK]; | 57 | struct clk *clk_bus[MAX_BUS_CLK]; |
| 54 | }; | 58 | }; |
| 55 | 59 | ||
| 60 | /** | ||
| 61 | * struct sdhci_s3c_driver_data - S3C SDHCI platform specific driver data | ||
| 62 | * @sdhci_quirks: sdhci host specific quirks. | ||
| 63 | * | ||
| 64 | * Specifies platform specific configuration of sdhci controller. | ||
| 65 | * Note: A structure for driver specific platform data is used for future | ||
| 66 | * expansion of its usage. | ||
| 67 | */ | ||
| 68 | struct sdhci_s3c_drv_data { | ||
| 69 | unsigned int sdhci_quirks; | ||
| 70 | }; | ||
| 71 | |||
| 56 | static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) | 72 | static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host) |
| 57 | { | 73 | { |
| 58 | return sdhci_priv(host); | 74 | return sdhci_priv(host); |
| @@ -132,10 +148,10 @@ static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost, | |||
| 132 | return UINT_MAX; | 148 | return UINT_MAX; |
| 133 | 149 | ||
| 134 | /* | 150 | /* |
| 135 | * Clock divider's step is different as 1 from that of host controller | 151 | * If controller uses a non-standard clock division, find the best clock |
| 136 | * when 'clk_type' is S3C_SDHCI_CLK_DIV_EXTERNAL. | 152 | * speed possible with selected clock source and skip the division. |
| 137 | */ | 153 | */ |
| 138 | if (ourhost->pdata->clk_type) { | 154 | if (ourhost->host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) { |
| 139 | rate = clk_round_rate(clksrc, wanted); | 155 | rate = clk_round_rate(clksrc, wanted); |
| 140 | return wanted - rate; | 156 | return wanted - rate; |
| 141 | } | 157 | } |
| @@ -272,6 +288,8 @@ static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) | |||
| 272 | static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) | 288 | static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) |
| 273 | { | 289 | { |
| 274 | struct sdhci_s3c *ourhost = to_s3c(host); | 290 | struct sdhci_s3c *ourhost = to_s3c(host); |
| 291 | unsigned long timeout; | ||
| 292 | u16 clk = 0; | ||
| 275 | 293 | ||
| 276 | /* don't bother if the clock is going off */ | 294 | /* don't bother if the clock is going off */ |
| 277 | if (clock == 0) | 295 | if (clock == 0) |
| @@ -282,6 +300,25 @@ static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock) | |||
| 282 | clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock); | 300 | clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock); |
| 283 | 301 | ||
| 284 | host->clock = clock; | 302 | host->clock = clock; |
| 303 | |||
| 304 | clk = SDHCI_CLOCK_INT_EN; | ||
| 305 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | ||
| 306 | |||
| 307 | /* Wait max 20 ms */ | ||
| 308 | timeout = 20; | ||
| 309 | while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) | ||
| 310 | & SDHCI_CLOCK_INT_STABLE)) { | ||
| 311 | if (timeout == 0) { | ||
| 312 | printk(KERN_ERR "%s: Internal clock never " | ||
| 313 | "stabilised.\n", mmc_hostname(host->mmc)); | ||
| 314 | return; | ||
| 315 | } | ||
| 316 | timeout--; | ||
| 317 | mdelay(1); | ||
| 318 | } | ||
| 319 | |||
| 320 | clk |= SDHCI_CLOCK_CARD_EN; | ||
| 321 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); | ||
| 285 | } | 322 | } |
| 286 | 323 | ||
| 287 | /** | 324 | /** |
| @@ -382,16 +419,24 @@ static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc) | |||
| 382 | } | 419 | } |
| 383 | } | 420 | } |
| 384 | 421 | ||
| 422 | static inline struct sdhci_s3c_drv_data *sdhci_s3c_get_driver_data( | ||
| 423 | struct platform_device *pdev) | ||
| 424 | { | ||
| 425 | return (struct sdhci_s3c_drv_data *) | ||
| 426 | platform_get_device_id(pdev)->driver_data; | ||
| 427 | } | ||
| 428 | |||
| 385 | static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | 429 | static int __devinit sdhci_s3c_probe(struct platform_device *pdev) |
| 386 | { | 430 | { |
| 387 | struct s3c_sdhci_platdata *pdata = pdev->dev.platform_data; | 431 | struct s3c_sdhci_platdata *pdata; |
| 432 | struct sdhci_s3c_drv_data *drv_data; | ||
| 388 | struct device *dev = &pdev->dev; | 433 | struct device *dev = &pdev->dev; |
| 389 | struct sdhci_host *host; | 434 | struct sdhci_host *host; |
| 390 | struct sdhci_s3c *sc; | 435 | struct sdhci_s3c *sc; |
| 391 | struct resource *res; | 436 | struct resource *res; |
| 392 | int ret, irq, ptr, clks; | 437 | int ret, irq, ptr, clks; |
| 393 | 438 | ||
| 394 | if (!pdata) { | 439 | if (!pdev->dev.platform_data) { |
| 395 | dev_err(dev, "no device data specified\n"); | 440 | dev_err(dev, "no device data specified\n"); |
| 396 | return -ENOENT; | 441 | return -ENOENT; |
| 397 | } | 442 | } |
| @@ -402,18 +447,20 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 402 | return irq; | 447 | return irq; |
| 403 | } | 448 | } |
| 404 | 449 | ||
| 405 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 406 | if (!res) { | ||
| 407 | dev_err(dev, "no memory specified\n"); | ||
| 408 | return -ENOENT; | ||
| 409 | } | ||
| 410 | |||
| 411 | host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c)); | 450 | host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c)); |
| 412 | if (IS_ERR(host)) { | 451 | if (IS_ERR(host)) { |
| 413 | dev_err(dev, "sdhci_alloc_host() failed\n"); | 452 | dev_err(dev, "sdhci_alloc_host() failed\n"); |
| 414 | return PTR_ERR(host); | 453 | return PTR_ERR(host); |
| 415 | } | 454 | } |
| 416 | 455 | ||
| 456 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | ||
| 457 | if (!pdata) { | ||
| 458 | ret = -ENOMEM; | ||
| 459 | goto err_io_clk; | ||
| 460 | } | ||
| 461 | memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata)); | ||
| 462 | |||
| 463 | drv_data = sdhci_s3c_get_driver_data(pdev); | ||
| 417 | sc = sdhci_priv(host); | 464 | sc = sdhci_priv(host); |
| 418 | 465 | ||
| 419 | sc->host = host; | 466 | sc->host = host; |
| @@ -464,15 +511,8 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 464 | goto err_no_busclks; | 511 | goto err_no_busclks; |
| 465 | } | 512 | } |
| 466 | 513 | ||
| 467 | sc->ioarea = request_mem_region(res->start, resource_size(res), | 514 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 468 | mmc_hostname(host->mmc)); | 515 | host->ioaddr = devm_request_and_ioremap(&pdev->dev, res); |
| 469 | if (!sc->ioarea) { | ||
| 470 | dev_err(dev, "failed to reserve register area\n"); | ||
| 471 | ret = -ENXIO; | ||
| 472 | goto err_req_regs; | ||
| 473 | } | ||
| 474 | |||
| 475 | host->ioaddr = ioremap_nocache(res->start, resource_size(res)); | ||
| 476 | if (!host->ioaddr) { | 516 | if (!host->ioaddr) { |
| 477 | dev_err(dev, "failed to map registers\n"); | 517 | dev_err(dev, "failed to map registers\n"); |
| 478 | ret = -ENXIO; | 518 | ret = -ENXIO; |
| @@ -491,6 +531,8 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 491 | /* Setup quirks for the controller */ | 531 | /* Setup quirks for the controller */ |
| 492 | host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC; | 532 | host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC; |
| 493 | host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT; | 533 | host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT; |
| 534 | if (drv_data) | ||
| 535 | host->quirks |= drv_data->sdhci_quirks; | ||
| 494 | 536 | ||
| 495 | #ifndef CONFIG_MMC_SDHCI_S3C_DMA | 537 | #ifndef CONFIG_MMC_SDHCI_S3C_DMA |
| 496 | 538 | ||
| @@ -518,6 +560,14 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 518 | if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT) | 560 | if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT) |
| 519 | host->mmc->caps = MMC_CAP_NONREMOVABLE; | 561 | host->mmc->caps = MMC_CAP_NONREMOVABLE; |
| 520 | 562 | ||
| 563 | switch (pdata->max_width) { | ||
| 564 | case 8: | ||
| 565 | host->mmc->caps |= MMC_CAP_8_BIT_DATA; | ||
| 566 | case 4: | ||
| 567 | host->mmc->caps |= MMC_CAP_4_BIT_DATA; | ||
| 568 | break; | ||
| 569 | } | ||
| 570 | |||
| 521 | if (pdata->pm_caps) | 571 | if (pdata->pm_caps) |
| 522 | host->mmc->pm_caps |= pdata->pm_caps; | 572 | host->mmc->pm_caps |= pdata->pm_caps; |
| 523 | 573 | ||
| @@ -531,7 +581,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 531 | * If controller does not have internal clock divider, | 581 | * If controller does not have internal clock divider, |
| 532 | * we can use overriding functions instead of default. | 582 | * we can use overriding functions instead of default. |
| 533 | */ | 583 | */ |
| 534 | if (pdata->clk_type) { | 584 | if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) { |
| 535 | sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; | 585 | sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock; |
| 536 | sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; | 586 | sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock; |
| 537 | sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; | 587 | sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock; |
| @@ -544,10 +594,17 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 544 | if (pdata->host_caps2) | 594 | if (pdata->host_caps2) |
| 545 | host->mmc->caps2 |= pdata->host_caps2; | 595 | host->mmc->caps2 |= pdata->host_caps2; |
| 546 | 596 | ||
| 597 | pm_runtime_enable(&pdev->dev); | ||
| 598 | pm_runtime_set_autosuspend_delay(&pdev->dev, 50); | ||
| 599 | pm_runtime_use_autosuspend(&pdev->dev); | ||
| 600 | pm_suspend_ignore_children(&pdev->dev, 1); | ||
| 601 | |||
| 547 | ret = sdhci_add_host(host); | 602 | ret = sdhci_add_host(host); |
| 548 | if (ret) { | 603 | if (ret) { |
| 549 | dev_err(dev, "sdhci_add_host() failed\n"); | 604 | dev_err(dev, "sdhci_add_host() failed\n"); |
| 550 | goto err_add_host; | 605 | pm_runtime_forbid(&pdev->dev); |
| 606 | pm_runtime_get_noresume(&pdev->dev); | ||
| 607 | goto err_req_regs; | ||
| 551 | } | 608 | } |
| 552 | 609 | ||
| 553 | /* The following two methods of card detection might call | 610 | /* The following two methods of card detection might call |
| @@ -561,10 +618,6 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 561 | 618 | ||
| 562 | return 0; | 619 | return 0; |
| 563 | 620 | ||
| 564 | err_add_host: | ||
| 565 | release_resource(sc->ioarea); | ||
| 566 | kfree(sc->ioarea); | ||
| 567 | |||
| 568 | err_req_regs: | 621 | err_req_regs: |
| 569 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { | 622 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { |
| 570 | if (sc->clk_bus[ptr]) { | 623 | if (sc->clk_bus[ptr]) { |
| @@ -601,6 +654,8 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 601 | 654 | ||
| 602 | sdhci_remove_host(host, 1); | 655 | sdhci_remove_host(host, 1); |
| 603 | 656 | ||
| 657 | pm_runtime_disable(&pdev->dev); | ||
| 658 | |||
| 604 | for (ptr = 0; ptr < 3; ptr++) { | 659 | for (ptr = 0; ptr < 3; ptr++) { |
| 605 | if (sc->clk_bus[ptr]) { | 660 | if (sc->clk_bus[ptr]) { |
| 606 | clk_disable(sc->clk_bus[ptr]); | 661 | clk_disable(sc->clk_bus[ptr]); |
| @@ -610,18 +665,13 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 610 | clk_disable(sc->clk_io); | 665 | clk_disable(sc->clk_io); |
| 611 | clk_put(sc->clk_io); | 666 | clk_put(sc->clk_io); |
| 612 | 667 | ||
| 613 | iounmap(host->ioaddr); | ||
| 614 | release_resource(sc->ioarea); | ||
| 615 | kfree(sc->ioarea); | ||
| 616 | |||
| 617 | sdhci_free_host(host); | 668 | sdhci_free_host(host); |
| 618 | platform_set_drvdata(pdev, NULL); | 669 | platform_set_drvdata(pdev, NULL); |
| 619 | 670 | ||
| 620 | return 0; | 671 | return 0; |
| 621 | } | 672 | } |
| 622 | 673 | ||
| 623 | #ifdef CONFIG_PM | 674 | #ifdef CONFIG_PM_SLEEP |
| 624 | |||
| 625 | static int sdhci_s3c_suspend(struct device *dev) | 675 | static int sdhci_s3c_suspend(struct device *dev) |
| 626 | { | 676 | { |
| 627 | struct sdhci_host *host = dev_get_drvdata(dev); | 677 | struct sdhci_host *host = dev_get_drvdata(dev); |
| @@ -635,10 +685,29 @@ static int sdhci_s3c_resume(struct device *dev) | |||
| 635 | 685 | ||
| 636 | return sdhci_resume_host(host); | 686 | return sdhci_resume_host(host); |
| 637 | } | 687 | } |
| 688 | #endif | ||
| 689 | |||
| 690 | #ifdef CONFIG_PM_RUNTIME | ||
| 691 | static int sdhci_s3c_runtime_suspend(struct device *dev) | ||
| 692 | { | ||
| 693 | struct sdhci_host *host = dev_get_drvdata(dev); | ||
| 694 | |||
| 695 | return sdhci_runtime_suspend_host(host); | ||
| 696 | } | ||
| 638 | 697 | ||
| 698 | static int sdhci_s3c_runtime_resume(struct device *dev) | ||
| 699 | { | ||
| 700 | struct sdhci_host *host = dev_get_drvdata(dev); | ||
| 701 | |||
| 702 | return sdhci_runtime_resume_host(host); | ||
| 703 | } | ||
| 704 | #endif | ||
| 705 | |||
| 706 | #ifdef CONFIG_PM | ||
| 639 | static const struct dev_pm_ops sdhci_s3c_pmops = { | 707 | static const struct dev_pm_ops sdhci_s3c_pmops = { |
| 640 | .suspend = sdhci_s3c_suspend, | 708 | SET_SYSTEM_SLEEP_PM_OPS(sdhci_s3c_suspend, sdhci_s3c_resume) |
| 641 | .resume = sdhci_s3c_resume, | 709 | SET_RUNTIME_PM_OPS(sdhci_s3c_runtime_suspend, sdhci_s3c_runtime_resume, |
| 710 | NULL) | ||
| 642 | }; | 711 | }; |
| 643 | 712 | ||
| 644 | #define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops) | 713 | #define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops) |
| @@ -647,9 +716,31 @@ static const struct dev_pm_ops sdhci_s3c_pmops = { | |||
| 647 | #define SDHCI_S3C_PMOPS NULL | 716 | #define SDHCI_S3C_PMOPS NULL |
| 648 | #endif | 717 | #endif |
| 649 | 718 | ||
| 719 | #if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212) | ||
| 720 | static struct sdhci_s3c_drv_data exynos4_sdhci_drv_data = { | ||
| 721 | .sdhci_quirks = SDHCI_QUIRK_NONSTANDARD_CLOCK, | ||
| 722 | }; | ||
| 723 | #define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)&exynos4_sdhci_drv_data) | ||
| 724 | #else | ||
| 725 | #define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)NULL) | ||
| 726 | #endif | ||
| 727 | |||
| 728 | static struct platform_device_id sdhci_s3c_driver_ids[] = { | ||
| 729 | { | ||
| 730 | .name = "s3c-sdhci", | ||
| 731 | .driver_data = (kernel_ulong_t)NULL, | ||
| 732 | }, { | ||
| 733 | .name = "exynos4-sdhci", | ||
| 734 | .driver_data = EXYNOS4_SDHCI_DRV_DATA, | ||
| 735 | }, | ||
| 736 | { } | ||
| 737 | }; | ||
| 738 | MODULE_DEVICE_TABLE(platform, sdhci_s3c_driver_ids); | ||
| 739 | |||
| 650 | static struct platform_driver sdhci_s3c_driver = { | 740 | static struct platform_driver sdhci_s3c_driver = { |
| 651 | .probe = sdhci_s3c_probe, | 741 | .probe = sdhci_s3c_probe, |
| 652 | .remove = __devexit_p(sdhci_s3c_remove), | 742 | .remove = __devexit_p(sdhci_s3c_remove), |
| 743 | .id_table = sdhci_s3c_driver_ids, | ||
| 653 | .driver = { | 744 | .driver = { |
| 654 | .owner = THIS_MODULE, | 745 | .owner = THIS_MODULE, |
| 655 | .name = "s3c-sdhci", | 746 | .name = "s3c-sdhci", |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 8262cadfdab7..9aa77f3f04a8 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -2782,8 +2782,9 @@ int sdhci_add_host(struct sdhci_host *host) | |||
| 2782 | mmc_card_is_removable(mmc)) | 2782 | mmc_card_is_removable(mmc)) |
| 2783 | mmc->caps |= MMC_CAP_NEEDS_POLL; | 2783 | mmc->caps |= MMC_CAP_NEEDS_POLL; |
| 2784 | 2784 | ||
| 2785 | /* UHS-I mode(s) supported by the host controller. */ | 2785 | /* Any UHS-I mode in caps implies SDR12 and SDR25 support. */ |
| 2786 | if (host->version >= SDHCI_SPEC_300) | 2786 | if (caps[1] & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 | |
| 2787 | SDHCI_SUPPORT_DDR50)) | ||
| 2787 | mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25; | 2788 | mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25; |
| 2788 | 2789 | ||
| 2789 | /* SDR104 supports also implies SDR50 support */ | 2790 | /* SDR104 supports also implies SDR50 support */ |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index aafaf0b6eb1c..724b35e85a26 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
| @@ -454,7 +454,8 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk) | |||
| 454 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK); | 454 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK); |
| 455 | else | 455 | else |
| 456 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR & | 456 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR & |
| 457 | ((fls(host->clk / clk) - 1) << 16)); | 457 | ((fls(DIV_ROUND_UP(host->clk, |
| 458 | clk) - 1) - 1) << 16)); | ||
| 458 | 459 | ||
| 459 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE); | 460 | sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE); |
| 460 | } | 461 | } |
| @@ -1297,14 +1298,8 @@ static int __devinit sh_mmcif_probe(struct platform_device *pdev) | |||
| 1297 | spin_lock_init(&host->lock); | 1298 | spin_lock_init(&host->lock); |
| 1298 | 1299 | ||
| 1299 | mmc->ops = &sh_mmcif_ops; | 1300 | mmc->ops = &sh_mmcif_ops; |
| 1300 | mmc->f_max = host->clk; | 1301 | mmc->f_max = host->clk / 2; |
| 1301 | /* close to 400KHz */ | 1302 | mmc->f_min = host->clk / 512; |
| 1302 | if (mmc->f_max < 51200000) | ||
| 1303 | mmc->f_min = mmc->f_max / 128; | ||
| 1304 | else if (mmc->f_max < 102400000) | ||
| 1305 | mmc->f_min = mmc->f_max / 256; | ||
| 1306 | else | ||
| 1307 | mmc->f_min = mmc->f_max / 512; | ||
| 1308 | if (pd->ocr) | 1303 | if (pd->ocr) |
| 1309 | mmc->ocr_avail = pd->ocr; | 1304 | mmc->ocr_avail = pd->ocr; |
| 1310 | mmc->caps = MMC_CAP_MMC_HIGHSPEED; | 1305 | mmc->caps = MMC_CAP_MMC_HIGHSPEED; |
diff --git a/drivers/mtd/ubi/debug.c b/drivers/mtd/ubi/debug.c index e2cdebf40840..61af9bb560ab 100644 --- a/drivers/mtd/ubi/debug.c +++ b/drivers/mtd/ubi/debug.c | |||
| @@ -386,19 +386,11 @@ out: | |||
| 386 | return count; | 386 | return count; |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | static int default_open(struct inode *inode, struct file *file) | ||
| 390 | { | ||
| 391 | if (inode->i_private) | ||
| 392 | file->private_data = inode->i_private; | ||
| 393 | |||
| 394 | return 0; | ||
| 395 | } | ||
| 396 | |||
| 397 | /* File operations for all UBI debugfs files */ | 389 | /* File operations for all UBI debugfs files */ |
| 398 | static const struct file_operations dfs_fops = { | 390 | static const struct file_operations dfs_fops = { |
| 399 | .read = dfs_file_read, | 391 | .read = dfs_file_read, |
| 400 | .write = dfs_file_write, | 392 | .write = dfs_file_write, |
| 401 | .open = default_open, | 393 | .open = simple_open, |
| 402 | .llseek = no_llseek, | 394 | .llseek = no_llseek, |
| 403 | .owner = THIS_MODULE, | 395 | .owner = THIS_MODULE, |
| 404 | }; | 396 | }; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 941b4e189adf..62d2409bb293 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -2034,6 +2034,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev) | |||
| 2034 | write_unlock_bh(&bond->lock); | 2034 | write_unlock_bh(&bond->lock); |
| 2035 | unblock_netpoll_tx(); | 2035 | unblock_netpoll_tx(); |
| 2036 | 2036 | ||
| 2037 | if (bond->slave_cnt == 0) | ||
| 2038 | call_netdevice_notifiers(NETDEV_CHANGEADDR, bond->dev); | ||
| 2039 | |||
| 2037 | bond_compute_features(bond); | 2040 | bond_compute_features(bond); |
| 2038 | if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && | 2041 | if (!(bond_dev->features & NETIF_F_VLAN_CHALLENGED) && |
| 2039 | (old_features & NETIF_F_VLAN_CHALLENGED)) | 2042 | (old_features & NETIF_F_VLAN_CHALLENGED)) |
| @@ -3007,7 +3010,11 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks) | |||
| 3007 | trans_start + delta_in_ticks)) || | 3010 | trans_start + delta_in_ticks)) || |
| 3008 | bond->curr_active_slave != slave) { | 3011 | bond->curr_active_slave != slave) { |
| 3009 | slave->link = BOND_LINK_UP; | 3012 | slave->link = BOND_LINK_UP; |
| 3010 | bond->current_arp_slave = NULL; | 3013 | if (bond->current_arp_slave) { |
| 3014 | bond_set_slave_inactive_flags( | ||
| 3015 | bond->current_arp_slave); | ||
| 3016 | bond->current_arp_slave = NULL; | ||
| 3017 | } | ||
| 3011 | 3018 | ||
| 3012 | pr_info("%s: link status definitely up for interface %s.\n", | 3019 | pr_info("%s: link status definitely up for interface %s.\n", |
| 3013 | bond->dev->name, slave->dev->name); | 3020 | bond->dev->name, slave->dev->name); |
| @@ -3701,17 +3708,52 @@ static void bond_set_multicast_list(struct net_device *bond_dev) | |||
| 3701 | read_unlock(&bond->lock); | 3708 | read_unlock(&bond->lock); |
| 3702 | } | 3709 | } |
| 3703 | 3710 | ||
| 3704 | static int bond_neigh_setup(struct net_device *dev, struct neigh_parms *parms) | 3711 | static int bond_neigh_init(struct neighbour *n) |
| 3705 | { | 3712 | { |
| 3706 | struct bonding *bond = netdev_priv(dev); | 3713 | struct bonding *bond = netdev_priv(n->dev); |
| 3707 | struct slave *slave = bond->first_slave; | 3714 | struct slave *slave = bond->first_slave; |
| 3715 | const struct net_device_ops *slave_ops; | ||
| 3716 | struct neigh_parms parms; | ||
| 3717 | int ret; | ||
| 3718 | |||
| 3719 | if (!slave) | ||
| 3720 | return 0; | ||
| 3721 | |||
| 3722 | slave_ops = slave->dev->netdev_ops; | ||
| 3723 | |||
| 3724 | if (!slave_ops->ndo_neigh_setup) | ||
| 3725 | return 0; | ||
| 3726 | |||
| 3727 | parms.neigh_setup = NULL; | ||
| 3728 | parms.neigh_cleanup = NULL; | ||
| 3729 | ret = slave_ops->ndo_neigh_setup(slave->dev, &parms); | ||
| 3730 | if (ret) | ||
| 3731 | return ret; | ||
| 3732 | |||
| 3733 | /* | ||
| 3734 | * Assign slave's neigh_cleanup to neighbour in case cleanup is called | ||
| 3735 | * after the last slave has been detached. Assumes that all slaves | ||
| 3736 | * utilize the same neigh_cleanup (true at this writing as only user | ||
| 3737 | * is ipoib). | ||
| 3738 | */ | ||
| 3739 | n->parms->neigh_cleanup = parms.neigh_cleanup; | ||
| 3740 | |||
| 3741 | if (!parms.neigh_setup) | ||
| 3742 | return 0; | ||
| 3743 | |||
| 3744 | return parms.neigh_setup(n); | ||
| 3745 | } | ||
| 3746 | |||
| 3747 | /* | ||
| 3748 | * The bonding ndo_neigh_setup is called at init time beofre any | ||
| 3749 | * slave exists. So we must declare proxy setup function which will | ||
| 3750 | * be used at run time to resolve the actual slave neigh param setup. | ||
| 3751 | */ | ||
| 3752 | static int bond_neigh_setup(struct net_device *dev, | ||
| 3753 | struct neigh_parms *parms) | ||
| 3754 | { | ||
| 3755 | parms->neigh_setup = bond_neigh_init; | ||
| 3708 | 3756 | ||
| 3709 | if (slave) { | ||
| 3710 | const struct net_device_ops *slave_ops | ||
| 3711 | = slave->dev->netdev_ops; | ||
| 3712 | if (slave_ops->ndo_neigh_setup) | ||
| 3713 | return slave_ops->ndo_neigh_setup(slave->dev, parms); | ||
| 3714 | } | ||
| 3715 | return 0; | 3757 | return 0; |
| 3716 | } | 3758 | } |
| 3717 | 3759 | ||
diff --git a/drivers/net/caif/caif_spi.c b/drivers/net/caif/caif_spi.c index 96391c36fa74..b71ce9bf0afb 100644 --- a/drivers/net/caif/caif_spi.c +++ b/drivers/net/caif/caif_spi.c | |||
| @@ -127,12 +127,6 @@ static inline void dev_debugfs_rem(struct cfspi *cfspi) | |||
| 127 | debugfs_remove(cfspi->dbgfs_dir); | 127 | debugfs_remove(cfspi->dbgfs_dir); |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | static int dbgfs_open(struct inode *inode, struct file *file) | ||
| 131 | { | ||
| 132 | file->private_data = inode->i_private; | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | |||
| 136 | static ssize_t dbgfs_state(struct file *file, char __user *user_buf, | 130 | static ssize_t dbgfs_state(struct file *file, char __user *user_buf, |
| 137 | size_t count, loff_t *ppos) | 131 | size_t count, loff_t *ppos) |
| 138 | { | 132 | { |
| @@ -243,13 +237,13 @@ static ssize_t dbgfs_frame(struct file *file, char __user *user_buf, | |||
| 243 | } | 237 | } |
| 244 | 238 | ||
| 245 | static const struct file_operations dbgfs_state_fops = { | 239 | static const struct file_operations dbgfs_state_fops = { |
| 246 | .open = dbgfs_open, | 240 | .open = simple_open, |
| 247 | .read = dbgfs_state, | 241 | .read = dbgfs_state, |
| 248 | .owner = THIS_MODULE | 242 | .owner = THIS_MODULE |
| 249 | }; | 243 | }; |
| 250 | 244 | ||
| 251 | static const struct file_operations dbgfs_frame_fops = { | 245 | static const struct file_operations dbgfs_frame_fops = { |
| 252 | .open = dbgfs_open, | 246 | .open = simple_open, |
| 253 | .read = dbgfs_frame, | 247 | .read = dbgfs_frame, |
| 254 | .owner = THIS_MODULE | 248 | .owner = THIS_MODULE |
| 255 | }; | 249 | }; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 44556b719e81..4b054812713a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -1874,7 +1874,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
| 1874 | * bnx2x_periodic_task(). | 1874 | * bnx2x_periodic_task(). |
| 1875 | */ | 1875 | */ |
| 1876 | smp_mb(); | 1876 | smp_mb(); |
| 1877 | queue_delayed_work(bnx2x_wq, &bp->period_task, 0); | ||
| 1878 | } else | 1877 | } else |
| 1879 | bp->port.pmf = 0; | 1878 | bp->port.pmf = 0; |
| 1880 | 1879 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h index cd6dfa9eaa3a..b9b263323436 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_fw_defs.h | |||
| @@ -25,31 +25,31 @@ | |||
| 25 | (IRO[149].base + ((funcId) * IRO[149].m1)) | 25 | (IRO[149].base + ((funcId) * IRO[149].m1)) |
| 26 | #define CSTORM_IGU_MODE_OFFSET (IRO[157].base) | 26 | #define CSTORM_IGU_MODE_OFFSET (IRO[157].base) |
| 27 | #define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ | 27 | #define CSTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ |
| 28 | (IRO[315].base + ((pfId) * IRO[315].m1)) | ||
| 29 | #define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
| 30 | (IRO[316].base + ((pfId) * IRO[316].m1)) | 28 | (IRO[316].base + ((pfId) * IRO[316].m1)) |
| 29 | #define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
| 30 | (IRO[317].base + ((pfId) * IRO[317].m1)) | ||
| 31 | #define CSTORM_ISCSI_EQ_CONS_OFFSET(pfId, iscsiEqId) \ | 31 | #define CSTORM_ISCSI_EQ_CONS_OFFSET(pfId, iscsiEqId) \ |
| 32 | (IRO[308].base + ((pfId) * IRO[308].m1) + ((iscsiEqId) * IRO[308].m2)) | 32 | (IRO[309].base + ((pfId) * IRO[309].m1) + ((iscsiEqId) * IRO[309].m2)) |
| 33 | #define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(pfId, iscsiEqId) \ | 33 | #define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(pfId, iscsiEqId) \ |
| 34 | (IRO[310].base + ((pfId) * IRO[310].m1) + ((iscsiEqId) * IRO[310].m2)) | 34 | (IRO[311].base + ((pfId) * IRO[311].m1) + ((iscsiEqId) * IRO[311].m2)) |
| 35 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(pfId, iscsiEqId) \ | 35 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(pfId, iscsiEqId) \ |
| 36 | (IRO[309].base + ((pfId) * IRO[309].m1) + ((iscsiEqId) * IRO[309].m2)) | 36 | (IRO[310].base + ((pfId) * IRO[310].m1) + ((iscsiEqId) * IRO[310].m2)) |
| 37 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(pfId, iscsiEqId) \ | 37 | #define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(pfId, iscsiEqId) \ |
| 38 | (IRO[311].base + ((pfId) * IRO[311].m1) + ((iscsiEqId) * IRO[311].m2)) | 38 | (IRO[312].base + ((pfId) * IRO[312].m1) + ((iscsiEqId) * IRO[312].m2)) |
| 39 | #define CSTORM_ISCSI_EQ_PROD_OFFSET(pfId, iscsiEqId) \ | 39 | #define CSTORM_ISCSI_EQ_PROD_OFFSET(pfId, iscsiEqId) \ |
| 40 | (IRO[307].base + ((pfId) * IRO[307].m1) + ((iscsiEqId) * IRO[307].m2)) | 40 | (IRO[308].base + ((pfId) * IRO[308].m1) + ((iscsiEqId) * IRO[308].m2)) |
| 41 | #define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(pfId, iscsiEqId) \ | 41 | #define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(pfId, iscsiEqId) \ |
| 42 | (IRO[313].base + ((pfId) * IRO[313].m1) + ((iscsiEqId) * IRO[313].m2)) | 42 | (IRO[314].base + ((pfId) * IRO[314].m1) + ((iscsiEqId) * IRO[314].m2)) |
| 43 | #define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(pfId, iscsiEqId) \ | 43 | #define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(pfId, iscsiEqId) \ |
| 44 | (IRO[312].base + ((pfId) * IRO[312].m1) + ((iscsiEqId) * IRO[312].m2)) | 44 | (IRO[313].base + ((pfId) * IRO[313].m1) + ((iscsiEqId) * IRO[313].m2)) |
| 45 | #define CSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ | 45 | #define CSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ |
| 46 | (IRO[314].base + ((pfId) * IRO[314].m1)) | 46 | (IRO[315].base + ((pfId) * IRO[315].m1)) |
| 47 | #define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 47 | #define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
| 48 | (IRO[306].base + ((pfId) * IRO[306].m1)) | 48 | (IRO[307].base + ((pfId) * IRO[307].m1)) |
| 49 | #define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 49 | #define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
| 50 | (IRO[305].base + ((pfId) * IRO[305].m1)) | 50 | (IRO[306].base + ((pfId) * IRO[306].m1)) |
| 51 | #define CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 51 | #define CSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
| 52 | (IRO[304].base + ((pfId) * IRO[304].m1)) | 52 | (IRO[305].base + ((pfId) * IRO[305].m1)) |
| 53 | #define CSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 53 | #define CSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
| 54 | (IRO[151].base + ((funcId) * IRO[151].m1)) | 54 | (IRO[151].base + ((funcId) * IRO[151].m1)) |
| 55 | #define CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(pfId) \ | 55 | #define CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(pfId) \ |
| @@ -96,37 +96,37 @@ | |||
| 96 | #define TSTORM_FUNC_EN_OFFSET(funcId) \ | 96 | #define TSTORM_FUNC_EN_OFFSET(funcId) \ |
| 97 | (IRO[103].base + ((funcId) * IRO[103].m1)) | 97 | (IRO[103].base + ((funcId) * IRO[103].m1)) |
| 98 | #define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ | 98 | #define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ |
| 99 | (IRO[271].base + ((pfId) * IRO[271].m1)) | ||
| 100 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CID_TABLE_OFFSET(pfId) \ | ||
| 101 | (IRO[272].base + ((pfId) * IRO[272].m1)) | 99 | (IRO[272].base + ((pfId) * IRO[272].m1)) |
| 102 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CLIENT_ID_TABLE_OFFSET(pfId) \ | 100 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CID_TABLE_OFFSET(pfId) \ |
| 103 | (IRO[273].base + ((pfId) * IRO[273].m1)) | 101 | (IRO[273].base + ((pfId) * IRO[273].m1)) |
| 104 | #define TSTORM_ISCSI_L2_ISCSI_OOO_PROD_OFFSET(pfId) \ | 102 | #define TSTORM_ISCSI_L2_ISCSI_OOO_CLIENT_ID_TABLE_OFFSET(pfId) \ |
| 105 | (IRO[274].base + ((pfId) * IRO[274].m1)) | 103 | (IRO[274].base + ((pfId) * IRO[274].m1)) |
| 104 | #define TSTORM_ISCSI_L2_ISCSI_OOO_PROD_OFFSET(pfId) \ | ||
| 105 | (IRO[275].base + ((pfId) * IRO[275].m1)) | ||
| 106 | #define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 106 | #define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
| 107 | (IRO[270].base + ((pfId) * IRO[270].m1)) | 107 | (IRO[271].base + ((pfId) * IRO[271].m1)) |
| 108 | #define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 108 | #define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
| 109 | (IRO[269].base + ((pfId) * IRO[269].m1)) | 109 | (IRO[270].base + ((pfId) * IRO[270].m1)) |
| 110 | #define TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 110 | #define TSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
| 111 | (IRO[268].base + ((pfId) * IRO[268].m1)) | 111 | (IRO[269].base + ((pfId) * IRO[269].m1)) |
| 112 | #define TSTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | 112 | #define TSTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ |
| 113 | (IRO[267].base + ((pfId) * IRO[267].m1)) | 113 | (IRO[268].base + ((pfId) * IRO[268].m1)) |
| 114 | #define TSTORM_ISCSI_TCP_LOCAL_ADV_WND_OFFSET(pfId) \ | 114 | #define TSTORM_ISCSI_TCP_LOCAL_ADV_WND_OFFSET(pfId) \ |
| 115 | (IRO[276].base + ((pfId) * IRO[276].m1)) | 115 | (IRO[277].base + ((pfId) * IRO[277].m1)) |
| 116 | #define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ | 116 | #define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ |
| 117 | (IRO[263].base + ((pfId) * IRO[263].m1)) | ||
| 118 | #define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | ||
| 119 | (IRO[264].base + ((pfId) * IRO[264].m1)) | 117 | (IRO[264].base + ((pfId) * IRO[264].m1)) |
| 120 | #define TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfId) \ | 118 | #define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ |
| 121 | (IRO[265].base + ((pfId) * IRO[265].m1)) | 119 | (IRO[265].base + ((pfId) * IRO[265].m1)) |
| 122 | #define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | 120 | #define TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfId) \ |
| 123 | (IRO[266].base + ((pfId) * IRO[266].m1)) | 121 | (IRO[266].base + ((pfId) * IRO[266].m1)) |
| 122 | #define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfId) \ | ||
| 123 | (IRO[267].base + ((pfId) * IRO[267].m1)) | ||
| 124 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(pfId) \ | 124 | #define TSTORM_MAC_FILTER_CONFIG_OFFSET(pfId) \ |
| 125 | (IRO[202].base + ((pfId) * IRO[202].m1)) | 125 | (IRO[202].base + ((pfId) * IRO[202].m1)) |
| 126 | #define TSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 126 | #define TSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
| 127 | (IRO[105].base + ((funcId) * IRO[105].m1)) | 127 | (IRO[105].base + ((funcId) * IRO[105].m1)) |
| 128 | #define TSTORM_TCP_MAX_CWND_OFFSET(pfId) \ | 128 | #define TSTORM_TCP_MAX_CWND_OFFSET(pfId) \ |
| 129 | (IRO[216].base + ((pfId) * IRO[216].m1)) | 129 | (IRO[217].base + ((pfId) * IRO[217].m1)) |
| 130 | #define TSTORM_VF_TO_PF_OFFSET(funcId) \ | 130 | #define TSTORM_VF_TO_PF_OFFSET(funcId) \ |
| 131 | (IRO[104].base + ((funcId) * IRO[104].m1)) | 131 | (IRO[104].base + ((funcId) * IRO[104].m1)) |
| 132 | #define USTORM_AGG_DATA_OFFSET (IRO[206].base) | 132 | #define USTORM_AGG_DATA_OFFSET (IRO[206].base) |
| @@ -140,29 +140,29 @@ | |||
| 140 | #define USTORM_ETH_PAUSE_ENABLED_OFFSET(portId) \ | 140 | #define USTORM_ETH_PAUSE_ENABLED_OFFSET(portId) \ |
| 141 | (IRO[183].base + ((portId) * IRO[183].m1)) | 141 | (IRO[183].base + ((portId) * IRO[183].m1)) |
| 142 | #define USTORM_FCOE_EQ_PROD_OFFSET(pfId) \ | 142 | #define USTORM_FCOE_EQ_PROD_OFFSET(pfId) \ |
| 143 | (IRO[317].base + ((pfId) * IRO[317].m1)) | 143 | (IRO[318].base + ((pfId) * IRO[318].m1)) |
| 144 | #define USTORM_FUNC_EN_OFFSET(funcId) \ | 144 | #define USTORM_FUNC_EN_OFFSET(funcId) \ |
| 145 | (IRO[178].base + ((funcId) * IRO[178].m1)) | 145 | (IRO[178].base + ((funcId) * IRO[178].m1)) |
| 146 | #define USTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ | 146 | #define USTORM_ISCSI_CQ_SIZE_OFFSET(pfId) \ |
| 147 | (IRO[281].base + ((pfId) * IRO[281].m1)) | ||
| 148 | #define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
| 149 | (IRO[282].base + ((pfId) * IRO[282].m1)) | 147 | (IRO[282].base + ((pfId) * IRO[282].m1)) |
| 148 | #define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(pfId) \ | ||
| 149 | (IRO[283].base + ((pfId) * IRO[283].m1)) | ||
| 150 | #define USTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ | 150 | #define USTORM_ISCSI_ERROR_BITMAP_OFFSET(pfId) \ |
| 151 | (IRO[286].base + ((pfId) * IRO[286].m1)) | 151 | (IRO[287].base + ((pfId) * IRO[287].m1)) |
| 152 | #define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(pfId) \ | 152 | #define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(pfId) \ |
| 153 | (IRO[283].base + ((pfId) * IRO[283].m1)) | 153 | (IRO[284].base + ((pfId) * IRO[284].m1)) |
| 154 | #define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 154 | #define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
| 155 | (IRO[279].base + ((pfId) * IRO[279].m1)) | 155 | (IRO[280].base + ((pfId) * IRO[280].m1)) |
| 156 | #define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 156 | #define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
| 157 | (IRO[278].base + ((pfId) * IRO[278].m1)) | 157 | (IRO[279].base + ((pfId) * IRO[279].m1)) |
| 158 | #define USTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 158 | #define USTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
| 159 | (IRO[277].base + ((pfId) * IRO[277].m1)) | 159 | (IRO[278].base + ((pfId) * IRO[278].m1)) |
| 160 | #define USTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ | 160 | #define USTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ |
| 161 | (IRO[280].base + ((pfId) * IRO[280].m1)) | 161 | (IRO[281].base + ((pfId) * IRO[281].m1)) |
| 162 | #define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfId) \ | 162 | #define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(pfId) \ |
| 163 | (IRO[284].base + ((pfId) * IRO[284].m1)) | ||
| 164 | #define USTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | ||
| 165 | (IRO[285].base + ((pfId) * IRO[285].m1)) | 163 | (IRO[285].base + ((pfId) * IRO[285].m1)) |
| 164 | #define USTORM_ISCSI_RQ_SIZE_OFFSET(pfId) \ | ||
| 165 | (IRO[286].base + ((pfId) * IRO[286].m1)) | ||
| 166 | #define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(pfId) \ | 166 | #define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(pfId) \ |
| 167 | (IRO[182].base + ((pfId) * IRO[182].m1)) | 167 | (IRO[182].base + ((pfId) * IRO[182].m1)) |
| 168 | #define USTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 168 | #define USTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
| @@ -188,39 +188,39 @@ | |||
| 188 | #define XSTORM_FUNC_EN_OFFSET(funcId) \ | 188 | #define XSTORM_FUNC_EN_OFFSET(funcId) \ |
| 189 | (IRO[47].base + ((funcId) * IRO[47].m1)) | 189 | (IRO[47].base + ((funcId) * IRO[47].m1)) |
| 190 | #define XSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ | 190 | #define XSTORM_ISCSI_HQ_SIZE_OFFSET(pfId) \ |
| 191 | (IRO[294].base + ((pfId) * IRO[294].m1)) | 191 | (IRO[295].base + ((pfId) * IRO[295].m1)) |
| 192 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(pfId) \ | 192 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(pfId) \ |
| 193 | (IRO[297].base + ((pfId) * IRO[297].m1)) | ||
| 194 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(pfId) \ | ||
| 195 | (IRO[298].base + ((pfId) * IRO[298].m1)) | 193 | (IRO[298].base + ((pfId) * IRO[298].m1)) |
| 196 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(pfId) \ | 194 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(pfId) \ |
| 197 | (IRO[299].base + ((pfId) * IRO[299].m1)) | 195 | (IRO[299].base + ((pfId) * IRO[299].m1)) |
| 198 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(pfId) \ | 196 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(pfId) \ |
| 199 | (IRO[300].base + ((pfId) * IRO[300].m1)) | 197 | (IRO[300].base + ((pfId) * IRO[300].m1)) |
| 200 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(pfId) \ | 198 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(pfId) \ |
| 201 | (IRO[301].base + ((pfId) * IRO[301].m1)) | 199 | (IRO[301].base + ((pfId) * IRO[301].m1)) |
| 202 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(pfId) \ | 200 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(pfId) \ |
| 203 | (IRO[302].base + ((pfId) * IRO[302].m1)) | 201 | (IRO[302].base + ((pfId) * IRO[302].m1)) |
| 204 | #define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(pfId) \ | 202 | #define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(pfId) \ |
| 205 | (IRO[303].base + ((pfId) * IRO[303].m1)) | 203 | (IRO[303].base + ((pfId) * IRO[303].m1)) |
| 204 | #define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(pfId) \ | ||
| 205 | (IRO[304].base + ((pfId) * IRO[304].m1)) | ||
| 206 | #define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ | 206 | #define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(pfId) \ |
| 207 | (IRO[293].base + ((pfId) * IRO[293].m1)) | 207 | (IRO[294].base + ((pfId) * IRO[294].m1)) |
| 208 | #define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ | 208 | #define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(pfId) \ |
| 209 | (IRO[292].base + ((pfId) * IRO[292].m1)) | 209 | (IRO[293].base + ((pfId) * IRO[293].m1)) |
| 210 | #define XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ | 210 | #define XSTORM_ISCSI_PAGE_SIZE_OFFSET(pfId) \ |
| 211 | (IRO[291].base + ((pfId) * IRO[291].m1)) | 211 | (IRO[292].base + ((pfId) * IRO[292].m1)) |
| 212 | #define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ | 212 | #define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(pfId) \ |
| 213 | (IRO[296].base + ((pfId) * IRO[296].m1)) | 213 | (IRO[297].base + ((pfId) * IRO[297].m1)) |
| 214 | #define XSTORM_ISCSI_SQ_SIZE_OFFSET(pfId) \ | 214 | #define XSTORM_ISCSI_SQ_SIZE_OFFSET(pfId) \ |
| 215 | (IRO[295].base + ((pfId) * IRO[295].m1)) | 215 | (IRO[296].base + ((pfId) * IRO[296].m1)) |
| 216 | #define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(pfId) \ | 216 | #define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(pfId) \ |
| 217 | (IRO[290].base + ((pfId) * IRO[290].m1)) | 217 | (IRO[291].base + ((pfId) * IRO[291].m1)) |
| 218 | #define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ | 218 | #define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(pfId) \ |
| 219 | (IRO[289].base + ((pfId) * IRO[289].m1)) | 219 | (IRO[290].base + ((pfId) * IRO[290].m1)) |
| 220 | #define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(pfId) \ | 220 | #define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(pfId) \ |
| 221 | (IRO[288].base + ((pfId) * IRO[288].m1)) | 221 | (IRO[289].base + ((pfId) * IRO[289].m1)) |
| 222 | #define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(pfId) \ | 222 | #define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(pfId) \ |
| 223 | (IRO[287].base + ((pfId) * IRO[287].m1)) | 223 | (IRO[288].base + ((pfId) * IRO[288].m1)) |
| 224 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(pfId) \ | 224 | #define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(pfId) \ |
| 225 | (IRO[44].base + ((pfId) * IRO[44].m1)) | 225 | (IRO[44].base + ((pfId) * IRO[44].m1)) |
| 226 | #define XSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ | 226 | #define XSTORM_RECORD_SLOW_PATH_OFFSET(funcId) \ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index efa557b76ac7..ad95324dc042 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
| @@ -1371,7 +1371,14 @@ static void bnx2x_update_pfc_xmac(struct link_params *params, | |||
| 1371 | pfc1_val |= XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN | | 1371 | pfc1_val |= XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN | |
| 1372 | XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN | | 1372 | XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN | |
| 1373 | XMAC_PFC_CTRL_HI_REG_RX_PFC_EN | | 1373 | XMAC_PFC_CTRL_HI_REG_RX_PFC_EN | |
| 1374 | XMAC_PFC_CTRL_HI_REG_TX_PFC_EN; | 1374 | XMAC_PFC_CTRL_HI_REG_TX_PFC_EN | |
| 1375 | XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON; | ||
| 1376 | /* Write pause and PFC registers */ | ||
| 1377 | REG_WR(bp, xmac_base + XMAC_REG_PAUSE_CTRL, pause_val); | ||
| 1378 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL, pfc0_val); | ||
| 1379 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI, pfc1_val); | ||
| 1380 | pfc1_val &= ~XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON; | ||
| 1381 | |||
| 1375 | } | 1382 | } |
| 1376 | 1383 | ||
| 1377 | /* Write pause and PFC registers */ | 1384 | /* Write pause and PFC registers */ |
| @@ -3648,6 +3655,33 @@ static void bnx2x_ext_phy_update_adv_fc(struct bnx2x_phy *phy, | |||
| 3648 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) { | 3655 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) { |
| 3649 | bnx2x_cl22_read(bp, phy, 0x4, &ld_pause); | 3656 | bnx2x_cl22_read(bp, phy, 0x4, &ld_pause); |
| 3650 | bnx2x_cl22_read(bp, phy, 0x5, &lp_pause); | 3657 | bnx2x_cl22_read(bp, phy, 0x5, &lp_pause); |
| 3658 | } else if (CHIP_IS_E3(bp) && | ||
| 3659 | SINGLE_MEDIA_DIRECT(params)) { | ||
| 3660 | u8 lane = bnx2x_get_warpcore_lane(phy, params); | ||
| 3661 | u16 gp_status, gp_mask; | ||
| 3662 | bnx2x_cl45_read(bp, phy, | ||
| 3663 | MDIO_AN_DEVAD, MDIO_WC_REG_GP2_STATUS_GP_2_4, | ||
| 3664 | &gp_status); | ||
| 3665 | gp_mask = (MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL | | ||
| 3666 | MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP) << | ||
| 3667 | lane; | ||
| 3668 | if ((gp_status & gp_mask) == gp_mask) { | ||
| 3669 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
| 3670 | MDIO_AN_REG_ADV_PAUSE, &ld_pause); | ||
| 3671 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
| 3672 | MDIO_AN_REG_LP_AUTO_NEG, &lp_pause); | ||
| 3673 | } else { | ||
| 3674 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
| 3675 | MDIO_AN_REG_CL37_FC_LD, &ld_pause); | ||
| 3676 | bnx2x_cl45_read(bp, phy, MDIO_AN_DEVAD, | ||
| 3677 | MDIO_AN_REG_CL37_FC_LP, &lp_pause); | ||
| 3678 | ld_pause = ((ld_pause & | ||
| 3679 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) | ||
| 3680 | << 3); | ||
| 3681 | lp_pause = ((lp_pause & | ||
| 3682 | MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH) | ||
| 3683 | << 3); | ||
| 3684 | } | ||
| 3651 | } else { | 3685 | } else { |
| 3652 | bnx2x_cl45_read(bp, phy, | 3686 | bnx2x_cl45_read(bp, phy, |
| 3653 | MDIO_AN_DEVAD, | 3687 | MDIO_AN_DEVAD, |
| @@ -3698,7 +3732,23 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
| 3698 | u16 val16 = 0, lane, bam37 = 0; | 3732 | u16 val16 = 0, lane, bam37 = 0; |
| 3699 | struct bnx2x *bp = params->bp; | 3733 | struct bnx2x *bp = params->bp; |
| 3700 | DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); | 3734 | DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n"); |
| 3701 | 3735 | /* Set to default registers that may be overriden by 10G force */ | |
| 3736 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3737 | MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7); | ||
| 3738 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
| 3739 | MDIO_WC_REG_PAR_DET_10G_CTRL, 0); | ||
| 3740 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3741 | MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 0); | ||
| 3742 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3743 | MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff); | ||
| 3744 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3745 | MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555); | ||
| 3746 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, | ||
| 3747 | MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0); | ||
| 3748 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3749 | MDIO_WC_REG_RX66_CONTROL, 0x7415); | ||
| 3750 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
| 3751 | MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190); | ||
| 3702 | /* Disable Autoneg: re-enable it after adv is done. */ | 3752 | /* Disable Autoneg: re-enable it after adv is done. */ |
| 3703 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | 3753 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, |
| 3704 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0); | 3754 | MDIO_WC_REG_IEEE0BLK_MIICNTL, 0); |
| @@ -3944,13 +3994,13 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy, | |||
| 3944 | 3994 | ||
| 3945 | } else { | 3995 | } else { |
| 3946 | misc1_val |= 0x9; | 3996 | misc1_val |= 0x9; |
| 3947 | tap_val = ((0x12 << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) | | 3997 | tap_val = ((0x0f << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) | |
| 3948 | (0x2d << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) | | 3998 | (0x2b << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) | |
| 3949 | (0x00 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET)); | 3999 | (0x02 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET)); |
| 3950 | tx_driver_val = | 4000 | tx_driver_val = |
| 3951 | ((0x02 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | | 4001 | ((0x03 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | |
| 3952 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | | 4002 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | |
| 3953 | (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)); | 4003 | (0x06 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)); |
| 3954 | } | 4004 | } |
| 3955 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | 4005 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, |
| 3956 | MDIO_WC_REG_SERDESDIGITAL_MISC1, misc1_val); | 4006 | MDIO_WC_REG_SERDESDIGITAL_MISC1, misc1_val); |
| @@ -4368,7 +4418,7 @@ static void bnx2x_warpcore_config_init(struct bnx2x_phy *phy, | |||
| 4368 | switch (serdes_net_if) { | 4418 | switch (serdes_net_if) { |
| 4369 | case PORT_HW_CFG_NET_SERDES_IF_KR: | 4419 | case PORT_HW_CFG_NET_SERDES_IF_KR: |
| 4370 | /* Enable KR Auto Neg */ | 4420 | /* Enable KR Auto Neg */ |
| 4371 | if (params->loopback_mode == LOOPBACK_NONE) | 4421 | if (params->loopback_mode != LOOPBACK_EXT) |
| 4372 | bnx2x_warpcore_enable_AN_KR(phy, params, vars); | 4422 | bnx2x_warpcore_enable_AN_KR(phy, params, vars); |
| 4373 | else { | 4423 | else { |
| 4374 | DP(NETIF_MSG_LINK, "Setting KR 10G-Force\n"); | 4424 | DP(NETIF_MSG_LINK, "Setting KR 10G-Force\n"); |
| @@ -6166,12 +6216,14 @@ int bnx2x_set_led(struct link_params *params, | |||
| 6166 | 6216 | ||
| 6167 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | 6217 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
| 6168 | if (params->phy[EXT_PHY1].type == | 6218 | if (params->phy[EXT_PHY1].type == |
| 6169 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) | 6219 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) |
| 6170 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp & 0xfff1); | 6220 | tmp &= ~(EMAC_LED_1000MB_OVERRIDE | |
| 6171 | else { | 6221 | EMAC_LED_100MB_OVERRIDE | |
| 6172 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | 6222 | EMAC_LED_10MB_OVERRIDE); |
| 6173 | (tmp | EMAC_LED_OVERRIDE)); | 6223 | else |
| 6174 | } | 6224 | tmp |= EMAC_LED_OVERRIDE; |
| 6225 | |||
| 6226 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp); | ||
| 6175 | break; | 6227 | break; |
| 6176 | 6228 | ||
| 6177 | case LED_MODE_OPER: | 6229 | case LED_MODE_OPER: |
| @@ -6226,10 +6278,15 @@ int bnx2x_set_led(struct link_params *params, | |||
| 6226 | hw_led_mode); | 6278 | hw_led_mode); |
| 6227 | } else if ((params->phy[EXT_PHY1].type == | 6279 | } else if ((params->phy[EXT_PHY1].type == |
| 6228 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && | 6280 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && |
| 6229 | (mode != LED_MODE_OPER)) { | 6281 | (mode == LED_MODE_ON)) { |
| 6230 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); | 6282 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); |
| 6231 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | 6283 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
| 6232 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp | 0x3); | 6284 | EMAC_WR(bp, EMAC_REG_EMAC_LED, tmp | |
| 6285 | EMAC_LED_OVERRIDE | EMAC_LED_1000MB_OVERRIDE); | ||
| 6286 | /* Break here; otherwise, it'll disable the | ||
| 6287 | * intended override. | ||
| 6288 | */ | ||
| 6289 | break; | ||
| 6233 | } else | 6290 | } else |
| 6234 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, | 6291 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, |
| 6235 | hw_led_mode); | 6292 | hw_led_mode); |
| @@ -6244,13 +6301,9 @@ int bnx2x_set_led(struct link_params *params, | |||
| 6244 | LED_BLINK_RATE_VAL_E1X_E2); | 6301 | LED_BLINK_RATE_VAL_E1X_E2); |
| 6245 | REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 + | 6302 | REG_WR(bp, NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 + |
| 6246 | port*4, 1); | 6303 | port*4, 1); |
| 6247 | if ((params->phy[EXT_PHY1].type != | 6304 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
| 6248 | PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM54618SE) && | 6305 | EMAC_WR(bp, EMAC_REG_EMAC_LED, |
| 6249 | (mode != LED_MODE_OPER)) { | 6306 | (tmp & (~EMAC_LED_OVERRIDE))); |
| 6250 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | ||
| 6251 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | ||
| 6252 | (tmp & (~EMAC_LED_OVERRIDE))); | ||
| 6253 | } | ||
| 6254 | 6307 | ||
| 6255 | if (CHIP_IS_E1(bp) && | 6308 | if (CHIP_IS_E1(bp) && |
| 6256 | ((speed == SPEED_2500) || | 6309 | ((speed == SPEED_2500) || |
| @@ -6843,6 +6896,12 @@ int bnx2x_link_update(struct link_params *params, struct link_vars *vars) | |||
| 6843 | SINGLE_MEDIA_DIRECT(params)) && | 6896 | SINGLE_MEDIA_DIRECT(params)) && |
| 6844 | (phy_vars[active_external_phy].fault_detected == 0)); | 6897 | (phy_vars[active_external_phy].fault_detected == 0)); |
| 6845 | 6898 | ||
| 6899 | /* Update the PFC configuration in case it was changed */ | ||
| 6900 | if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) | ||
| 6901 | vars->link_status |= LINK_STATUS_PFC_ENABLED; | ||
| 6902 | else | ||
| 6903 | vars->link_status &= ~LINK_STATUS_PFC_ENABLED; | ||
| 6904 | |||
| 6846 | if (vars->link_up) | 6905 | if (vars->link_up) |
| 6847 | rc = bnx2x_update_link_up(params, vars, link_10g_plus); | 6906 | rc = bnx2x_update_link_up(params, vars, link_10g_plus); |
| 6848 | else | 6907 | else |
| @@ -8030,7 +8089,9 @@ static int bnx2x_verify_sfp_module(struct bnx2x_phy *phy, | |||
| 8030 | netdev_err(bp->dev, "Warning: Unqualified SFP+ module detected," | 8089 | netdev_err(bp->dev, "Warning: Unqualified SFP+ module detected," |
| 8031 | " Port %d from %s part number %s\n", | 8090 | " Port %d from %s part number %s\n", |
| 8032 | params->port, vendor_name, vendor_pn); | 8091 | params->port, vendor_name, vendor_pn); |
| 8033 | phy->flags |= FLAGS_SFP_NOT_APPROVED; | 8092 | if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) != |
| 8093 | PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_WARNING_MSG) | ||
| 8094 | phy->flags |= FLAGS_SFP_NOT_APPROVED; | ||
| 8034 | return -EINVAL; | 8095 | return -EINVAL; |
| 8035 | } | 8096 | } |
| 8036 | 8097 | ||
| @@ -9090,6 +9151,12 @@ static int bnx2x_8727_config_init(struct bnx2x_phy *phy, | |||
| 9090 | tmp2 &= 0xFFEF; | 9151 | tmp2 &= 0xFFEF; |
| 9091 | bnx2x_cl45_write(bp, phy, | 9152 | bnx2x_cl45_write(bp, phy, |
| 9092 | MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_OPT_CFG_REG, tmp2); | 9153 | MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_OPT_CFG_REG, tmp2); |
| 9154 | bnx2x_cl45_read(bp, phy, | ||
| 9155 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, | ||
| 9156 | &tmp2); | ||
| 9157 | bnx2x_cl45_write(bp, phy, | ||
| 9158 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, | ||
| 9159 | (tmp2 & 0x7fff)); | ||
| 9093 | } | 9160 | } |
| 9094 | 9161 | ||
| 9095 | return 0; | 9162 | return 0; |
| @@ -9270,12 +9337,11 @@ static u8 bnx2x_8727_read_status(struct bnx2x_phy *phy, | |||
| 9270 | MDIO_PMA_DEVAD, MDIO_PMA_LASI_RXCTRL, | 9337 | MDIO_PMA_DEVAD, MDIO_PMA_LASI_RXCTRL, |
| 9271 | ((1<<5) | (1<<2))); | 9338 | ((1<<5) | (1<<2))); |
| 9272 | } | 9339 | } |
| 9273 | DP(NETIF_MSG_LINK, "Enabling 8727 TX laser if SFP is approved\n"); | 9340 | |
| 9274 | bnx2x_8727_specific_func(phy, params, ENABLE_TX); | 9341 | if (!(phy->flags & FLAGS_SFP_NOT_APPROVED)) { |
| 9275 | /* If transmitter is disabled, ignore false link up indication */ | 9342 | DP(NETIF_MSG_LINK, "Enabling 8727 TX laser\n"); |
| 9276 | bnx2x_cl45_read(bp, phy, | 9343 | bnx2x_sfp_set_transmitter(params, phy, 1); |
| 9277 | MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, &val1); | 9344 | } else { |
| 9278 | if (val1 & (1<<15)) { | ||
| 9279 | DP(NETIF_MSG_LINK, "Tx is disabled\n"); | 9345 | DP(NETIF_MSG_LINK, "Tx is disabled\n"); |
| 9280 | return 0; | 9346 | return 0; |
| 9281 | } | 9347 | } |
| @@ -9369,8 +9435,7 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy, | |||
| 9369 | 9435 | ||
| 9370 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { | 9436 | if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) { |
| 9371 | bnx2x_cl45_read(bp, phy, MDIO_CTL_DEVAD, 0x400f, &fw_ver1); | 9437 | bnx2x_cl45_read(bp, phy, MDIO_CTL_DEVAD, 0x400f, &fw_ver1); |
| 9372 | bnx2x_save_spirom_version(bp, port, | 9438 | bnx2x_save_spirom_version(bp, port, fw_ver1 & 0xfff, |
| 9373 | ((fw_ver1 & 0xf000)>>5) | (fw_ver1 & 0x7f), | ||
| 9374 | phy->ver_addr); | 9439 | phy->ver_addr); |
| 9375 | } else { | 9440 | } else { |
| 9376 | /* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */ | 9441 | /* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */ |
| @@ -9793,6 +9858,15 @@ static int bnx2x_84833_hw_reset_phy(struct bnx2x_phy *phy, | |||
| 9793 | other_shmem_base_addr)); | 9858 | other_shmem_base_addr)); |
| 9794 | 9859 | ||
| 9795 | u32 shmem_base_path[2]; | 9860 | u32 shmem_base_path[2]; |
| 9861 | |||
| 9862 | /* Work around for 84833 LED failure inside RESET status */ | ||
| 9863 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
| 9864 | MDIO_AN_REG_8481_LEGACY_MII_CTRL, | ||
| 9865 | MDIO_AN_REG_8481_MII_CTRL_FORCE_1G); | ||
| 9866 | bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, | ||
| 9867 | MDIO_AN_REG_8481_1G_100T_EXT_CTRL, | ||
| 9868 | MIDO_AN_REG_8481_EXT_CTRL_FORCE_LEDS_OFF); | ||
| 9869 | |||
| 9796 | shmem_base_path[0] = params->shmem_base; | 9870 | shmem_base_path[0] = params->shmem_base; |
| 9797 | shmem_base_path[1] = other_shmem_base_addr; | 9871 | shmem_base_path[1] = other_shmem_base_addr; |
| 9798 | 9872 | ||
| @@ -10103,7 +10177,7 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy, | |||
| 10103 | u8 port; | 10177 | u8 port; |
| 10104 | u16 val16; | 10178 | u16 val16; |
| 10105 | 10179 | ||
| 10106 | if (!(CHIP_IS_E1(bp))) | 10180 | if (!(CHIP_IS_E1x(bp))) |
| 10107 | port = BP_PATH(bp); | 10181 | port = BP_PATH(bp); |
| 10108 | else | 10182 | else |
| 10109 | port = params->port; | 10183 | port = params->port; |
| @@ -10130,7 +10204,7 @@ static void bnx2x_848xx_set_link_led(struct bnx2x_phy *phy, | |||
| 10130 | u16 val; | 10204 | u16 val; |
| 10131 | u8 port; | 10205 | u8 port; |
| 10132 | 10206 | ||
| 10133 | if (!(CHIP_IS_E1(bp))) | 10207 | if (!(CHIP_IS_E1x(bp))) |
| 10134 | port = BP_PATH(bp); | 10208 | port = BP_PATH(bp); |
| 10135 | else | 10209 | else |
| 10136 | port = params->port; | 10210 | port = params->port; |
| @@ -12049,6 +12123,9 @@ int bnx2x_phy_init(struct link_params *params, struct link_vars *vars) | |||
| 12049 | 12123 | ||
| 12050 | bnx2x_emac_init(params, vars); | 12124 | bnx2x_emac_init(params, vars); |
| 12051 | 12125 | ||
| 12126 | if (params->feature_config_flags & FEATURE_CONFIG_PFC_ENABLED) | ||
| 12127 | vars->link_status |= LINK_STATUS_PFC_ENABLED; | ||
| 12128 | |||
| 12052 | if (params->num_phys == 0) { | 12129 | if (params->num_phys == 0) { |
| 12053 | DP(NETIF_MSG_LINK, "No phy found for initialization !!\n"); | 12130 | DP(NETIF_MSG_LINK, "No phy found for initialization !!\n"); |
| 12054 | return -EINVAL; | 12131 | return -EINVAL; |
| @@ -12128,10 +12205,10 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars, | |||
| 12128 | * Hold it as vars low | 12205 | * Hold it as vars low |
| 12129 | */ | 12206 | */ |
| 12130 | /* clear link led */ | 12207 | /* clear link led */ |
| 12208 | bnx2x_set_mdio_clk(bp, params->chip_id, port); | ||
| 12131 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); | 12209 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); |
| 12132 | 12210 | ||
| 12133 | if (reset_ext_phy) { | 12211 | if (reset_ext_phy) { |
| 12134 | bnx2x_set_mdio_clk(bp, params->chip_id, port); | ||
| 12135 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; | 12212 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; |
| 12136 | phy_index++) { | 12213 | phy_index++) { |
| 12137 | if (params->phy[phy_index].link_reset) { | 12214 | if (params->phy[phy_index].link_reset) { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index ab0a250f95fa..c25803b9c0ca 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | |||
| @@ -5354,6 +5354,7 @@ | |||
| 5354 | #define XMAC_CTRL_REG_TX_EN (0x1<<0) | 5354 | #define XMAC_CTRL_REG_TX_EN (0x1<<0) |
| 5355 | #define XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN (0x1<<18) | 5355 | #define XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN (0x1<<18) |
| 5356 | #define XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN (0x1<<17) | 5356 | #define XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN (0x1<<17) |
| 5357 | #define XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON (0x1<<1) | ||
| 5357 | #define XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN (0x1<<0) | 5358 | #define XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN (0x1<<0) |
| 5358 | #define XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN (0x1<<3) | 5359 | #define XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN (0x1<<3) |
| 5359 | #define XMAC_PFC_CTRL_HI_REG_RX_PFC_EN (0x1<<4) | 5360 | #define XMAC_PFC_CTRL_HI_REG_RX_PFC_EN (0x1<<4) |
| @@ -6820,10 +6821,13 @@ Theotherbitsarereservedandshouldbezero*/ | |||
| 6820 | 6821 | ||
| 6821 | #define MDIO_AN_REG_8481_10GBASE_T_AN_CTRL 0x0020 | 6822 | #define MDIO_AN_REG_8481_10GBASE_T_AN_CTRL 0x0020 |
| 6822 | #define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 | 6823 | #define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 |
| 6824 | #define MDIO_AN_REG_8481_MII_CTRL_FORCE_1G 0x40 | ||
| 6823 | #define MDIO_AN_REG_8481_LEGACY_MII_STATUS 0xffe1 | 6825 | #define MDIO_AN_REG_8481_LEGACY_MII_STATUS 0xffe1 |
| 6824 | #define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 | 6826 | #define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 |
| 6825 | #define MDIO_AN_REG_8481_LEGACY_AN_EXPANSION 0xffe6 | 6827 | #define MDIO_AN_REG_8481_LEGACY_AN_EXPANSION 0xffe6 |
| 6826 | #define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 | 6828 | #define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 |
| 6829 | #define MDIO_AN_REG_8481_1G_100T_EXT_CTRL 0xfff0 | ||
| 6830 | #define MIDO_AN_REG_8481_EXT_CTRL_FORCE_LEDS_OFF 0x0008 | ||
| 6827 | #define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 | 6831 | #define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 |
| 6828 | #define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 | 6832 | #define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 |
| 6829 | #define MDIO_AN_REG_8481_AUX_CTRL 0xfff8 | 6833 | #define MDIO_AN_REG_8481_AUX_CTRL 0xfff8 |
| @@ -6943,6 +6947,10 @@ Theotherbitsarereservedandshouldbezero*/ | |||
| 6943 | #define MDIO_WC_REG_GP2_STATUS_GP_2_2 0x81d2 | 6947 | #define MDIO_WC_REG_GP2_STATUS_GP_2_2 0x81d2 |
| 6944 | #define MDIO_WC_REG_GP2_STATUS_GP_2_3 0x81d3 | 6948 | #define MDIO_WC_REG_GP2_STATUS_GP_2_3 0x81d3 |
| 6945 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4 0x81d4 | 6949 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4 0x81d4 |
| 6950 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL 0x1000 | ||
| 6951 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CMPL 0x0100 | ||
| 6952 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP 0x0010 | ||
| 6953 | #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CAP 0x1 | ||
| 6946 | #define MDIO_WC_REG_UC_INFO_B0_DEAD_TRAP 0x81EE | 6954 | #define MDIO_WC_REG_UC_INFO_B0_DEAD_TRAP 0x81EE |
| 6947 | #define MDIO_WC_REG_UC_INFO_B1_VERSION 0x81F0 | 6955 | #define MDIO_WC_REG_UC_INFO_B1_VERSION 0x81F0 |
| 6948 | #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE 0x81F2 | 6956 | #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE 0x81F2 |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 05ff076af06d..b126b98065a9 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -2000,13 +2000,6 @@ static const struct ethtool_ops cxgb_ethtool_ops = { | |||
| 2000 | /* | 2000 | /* |
| 2001 | * debugfs support | 2001 | * debugfs support |
| 2002 | */ | 2002 | */ |
| 2003 | |||
| 2004 | static int mem_open(struct inode *inode, struct file *file) | ||
| 2005 | { | ||
| 2006 | file->private_data = inode->i_private; | ||
| 2007 | return 0; | ||
| 2008 | } | ||
| 2009 | |||
| 2010 | static ssize_t mem_read(struct file *file, char __user *buf, size_t count, | 2003 | static ssize_t mem_read(struct file *file, char __user *buf, size_t count, |
| 2011 | loff_t *ppos) | 2004 | loff_t *ppos) |
| 2012 | { | 2005 | { |
| @@ -2050,7 +2043,7 @@ static ssize_t mem_read(struct file *file, char __user *buf, size_t count, | |||
| 2050 | 2043 | ||
| 2051 | static const struct file_operations mem_debugfs_fops = { | 2044 | static const struct file_operations mem_debugfs_fops = { |
| 2052 | .owner = THIS_MODULE, | 2045 | .owner = THIS_MODULE, |
| 2053 | .open = mem_open, | 2046 | .open = simple_open, |
| 2054 | .read = mem_read, | 2047 | .read = mem_read, |
| 2055 | .llseek = default_llseek, | 2048 | .llseek = default_llseek, |
| 2056 | }; | 2049 | }; |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 86cdd4793992..b83897f76ee3 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
| @@ -161,6 +161,12 @@ struct e1000_info; | |||
| 161 | /* Time to wait before putting the device into D3 if there's no link (in ms). */ | 161 | /* Time to wait before putting the device into D3 if there's no link (in ms). */ |
| 162 | #define LINK_TIMEOUT 100 | 162 | #define LINK_TIMEOUT 100 |
| 163 | 163 | ||
| 164 | /* | ||
| 165 | * Count for polling __E1000_RESET condition every 10-20msec. | ||
| 166 | * Experimentation has shown the reset can take approximately 210msec. | ||
| 167 | */ | ||
| 168 | #define E1000_CHECK_RESET_COUNT 25 | ||
| 169 | |||
| 164 | #define DEFAULT_RDTR 0 | 170 | #define DEFAULT_RDTR 0 |
| 165 | #define DEFAULT_RADV 8 | 171 | #define DEFAULT_RADV 8 |
| 166 | #define BURST_RDTR 0x20 | 172 | #define BURST_RDTR 0x20 |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 2c38a65ade87..19ab2154802c 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -1059,6 +1059,13 @@ static void e1000_print_hw_hang(struct work_struct *work) | |||
| 1059 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | 1059 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); |
| 1060 | /* execute the writes immediately */ | 1060 | /* execute the writes immediately */ |
| 1061 | e1e_flush(); | 1061 | e1e_flush(); |
| 1062 | /* | ||
| 1063 | * Due to rare timing issues, write to TIDV again to ensure | ||
| 1064 | * the write is successful | ||
| 1065 | */ | ||
| 1066 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
| 1067 | /* execute the writes immediately */ | ||
| 1068 | e1e_flush(); | ||
| 1062 | adapter->tx_hang_recheck = true; | 1069 | adapter->tx_hang_recheck = true; |
| 1063 | return; | 1070 | return; |
| 1064 | } | 1071 | } |
| @@ -3616,6 +3623,16 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter) | |||
| 3616 | 3623 | ||
| 3617 | /* execute the writes immediately */ | 3624 | /* execute the writes immediately */ |
| 3618 | e1e_flush(); | 3625 | e1e_flush(); |
| 3626 | |||
| 3627 | /* | ||
| 3628 | * due to rare timing issues, write to TIDV/RDTR again to ensure the | ||
| 3629 | * write is successful | ||
| 3630 | */ | ||
| 3631 | ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD); | ||
| 3632 | ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD); | ||
| 3633 | |||
| 3634 | /* execute the writes immediately */ | ||
| 3635 | e1e_flush(); | ||
| 3619 | } | 3636 | } |
| 3620 | 3637 | ||
| 3621 | static void e1000e_update_stats(struct e1000_adapter *adapter); | 3638 | static void e1000e_update_stats(struct e1000_adapter *adapter); |
| @@ -3968,6 +3985,10 @@ static int e1000_close(struct net_device *netdev) | |||
| 3968 | { | 3985 | { |
| 3969 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3986 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 3970 | struct pci_dev *pdev = adapter->pdev; | 3987 | struct pci_dev *pdev = adapter->pdev; |
| 3988 | int count = E1000_CHECK_RESET_COUNT; | ||
| 3989 | |||
| 3990 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
| 3991 | usleep_range(10000, 20000); | ||
| 3971 | 3992 | ||
| 3972 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 3993 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
| 3973 | 3994 | ||
| @@ -5472,6 +5493,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, | |||
| 5472 | netif_device_detach(netdev); | 5493 | netif_device_detach(netdev); |
| 5473 | 5494 | ||
| 5474 | if (netif_running(netdev)) { | 5495 | if (netif_running(netdev)) { |
| 5496 | int count = E1000_CHECK_RESET_COUNT; | ||
| 5497 | |||
| 5498 | while (test_bit(__E1000_RESETTING, &adapter->state) && count--) | ||
| 5499 | usleep_range(10000, 20000); | ||
| 5500 | |||
| 5475 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); | 5501 | WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); |
| 5476 | e1000e_down(adapter); | 5502 | e1000e_down(adapter); |
| 5477 | e1000_free_irq(adapter); | 5503 | e1000_free_irq(adapter); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c index dde65f951400..652e4b09546d 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.c | |||
| @@ -44,62 +44,94 @@ | |||
| 44 | #define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ | 44 | #define DCB_NO_HW_CHG 1 /* DCB configuration did not change */ |
| 45 | #define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ | 45 | #define DCB_HW_CHG 2 /* DCB configuration changed, no reset */ |
| 46 | 46 | ||
| 47 | int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *src_dcb_cfg, | 47 | int ixgbe_copy_dcb_cfg(struct ixgbe_dcb_config *scfg, |
| 48 | struct ixgbe_dcb_config *dst_dcb_cfg, int tc_max) | 48 | struct ixgbe_dcb_config *dcfg, int tc_max) |
| 49 | { | 49 | { |
| 50 | struct tc_configuration *src_tc_cfg = NULL; | 50 | struct tc_configuration *src = NULL; |
| 51 | struct tc_configuration *dst_tc_cfg = NULL; | 51 | struct tc_configuration *dst = NULL; |
| 52 | int i; | 52 | int i, j; |
| 53 | int tx = DCB_TX_CONFIG; | ||
| 54 | int rx = DCB_RX_CONFIG; | ||
| 55 | int changes = 0; | ||
| 53 | 56 | ||
| 54 | if (!src_dcb_cfg || !dst_dcb_cfg) | 57 | if (!scfg || !dcfg) |
| 55 | return -EINVAL; | 58 | return changes; |
| 56 | 59 | ||
| 57 | for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { | 60 | for (i = DCB_PG_ATTR_TC_0; i < tc_max + DCB_PG_ATTR_TC_0; i++) { |
| 58 | src_tc_cfg = &src_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; | 61 | src = &scfg->tc_config[i - DCB_PG_ATTR_TC_0]; |
| 59 | dst_tc_cfg = &dst_dcb_cfg->tc_config[i - DCB_PG_ATTR_TC_0]; | 62 | dst = &dcfg->tc_config[i - DCB_PG_ATTR_TC_0]; |
| 60 | 63 | ||
| 61 | dst_tc_cfg->path[DCB_TX_CONFIG].prio_type = | 64 | if (dst->path[tx].prio_type != src->path[tx].prio_type) { |
| 62 | src_tc_cfg->path[DCB_TX_CONFIG].prio_type; | 65 | dst->path[tx].prio_type = src->path[tx].prio_type; |
| 66 | changes |= BIT_PG_TX; | ||
| 67 | } | ||
| 63 | 68 | ||
| 64 | dst_tc_cfg->path[DCB_TX_CONFIG].bwg_id = | 69 | if (dst->path[tx].bwg_id != src->path[tx].bwg_id) { |
| 65 | src_tc_cfg->path[DCB_TX_CONFIG].bwg_id; | 70 | dst->path[tx].bwg_id = src->path[tx].bwg_id; |
| 71 | changes |= BIT_PG_TX; | ||
| 72 | } | ||
| 66 | 73 | ||
| 67 | dst_tc_cfg->path[DCB_TX_CONFIG].bwg_percent = | 74 | if (dst->path[tx].bwg_percent != src->path[tx].bwg_percent) { |
| 68 | src_tc_cfg->path[DCB_TX_CONFIG].bwg_percent; | 75 | dst->path[tx].bwg_percent = src->path[tx].bwg_percent; |
| 76 | changes |= BIT_PG_TX; | ||
| 77 | } | ||
| 69 | 78 | ||
| 70 | dst_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap = | 79 | if (dst->path[tx].up_to_tc_bitmap != |
| 71 | src_tc_cfg->path[DCB_TX_CONFIG].up_to_tc_bitmap; | 80 | src->path[tx].up_to_tc_bitmap) { |
| 81 | dst->path[tx].up_to_tc_bitmap = | ||
| 82 | src->path[tx].up_to_tc_bitmap; | ||
| 83 | changes |= (BIT_PG_TX | BIT_PFC | BIT_APP_UPCHG); | ||
| 84 | } | ||
| 72 | 85 | ||
| 73 | dst_tc_cfg->path[DCB_RX_CONFIG].prio_type = | 86 | if (dst->path[rx].prio_type != src->path[rx].prio_type) { |
| 74 | src_tc_cfg->path[DCB_RX_CONFIG].prio_type; | 87 | dst->path[rx].prio_type = src->path[rx].prio_type; |
| 88 | changes |= BIT_PG_RX; | ||
| 89 | } | ||
| 75 | 90 | ||
| 76 | dst_tc_cfg->path[DCB_RX_CONFIG].bwg_id = | 91 | if (dst->path[rx].bwg_id != src->path[rx].bwg_id) { |
| 77 | src_tc_cfg->path[DCB_RX_CONFIG].bwg_id; | 92 | dst->path[rx].bwg_id = src->path[rx].bwg_id; |
| 93 | changes |= BIT_PG_RX; | ||
| 94 | } | ||
| 78 | 95 | ||
| 79 | dst_tc_cfg->path[DCB_RX_CONFIG].bwg_percent = | 96 | if (dst->path[rx].bwg_percent != src->path[rx].bwg_percent) { |
| 80 | src_tc_cfg->path[DCB_RX_CONFIG].bwg_percent; | 97 | dst->path[rx].bwg_percent = src->path[rx].bwg_percent; |
| 98 | changes |= BIT_PG_RX; | ||
| 99 | } | ||
| 81 | 100 | ||
| 82 | dst_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap = | 101 | if (dst->path[rx].up_to_tc_bitmap != |
| 83 | src_tc_cfg->path[DCB_RX_CONFIG].up_to_tc_bitmap; | 102 | src->path[rx].up_to_tc_bitmap) { |
| 103 | dst->path[rx].up_to_tc_bitmap = | ||
| 104 | src->path[rx].up_to_tc_bitmap; | ||
| 105 | changes |= (BIT_PG_RX | BIT_PFC | BIT_APP_UPCHG); | ||
| 106 | } | ||
| 84 | } | 107 | } |
| 85 | 108 | ||
| 86 | for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { | 109 | for (i = DCB_PG_ATTR_BW_ID_0; i < DCB_PG_ATTR_BW_ID_MAX; i++) { |
| 87 | dst_dcb_cfg->bw_percentage[DCB_TX_CONFIG] | 110 | j = i - DCB_PG_ATTR_BW_ID_0; |
| 88 | [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage | 111 | if (dcfg->bw_percentage[tx][j] != scfg->bw_percentage[tx][j]) { |
| 89 | [DCB_TX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; | 112 | dcfg->bw_percentage[tx][j] = scfg->bw_percentage[tx][j]; |
| 90 | dst_dcb_cfg->bw_percentage[DCB_RX_CONFIG] | 113 | changes |= BIT_PG_TX; |
| 91 | [i-DCB_PG_ATTR_BW_ID_0] = src_dcb_cfg->bw_percentage | 114 | } |
| 92 | [DCB_RX_CONFIG][i-DCB_PG_ATTR_BW_ID_0]; | 115 | if (dcfg->bw_percentage[rx][j] != scfg->bw_percentage[rx][j]) { |
| 116 | dcfg->bw_percentage[rx][j] = scfg->bw_percentage[rx][j]; | ||
| 117 | changes |= BIT_PG_RX; | ||
| 118 | } | ||
| 93 | } | 119 | } |
| 94 | 120 | ||
| 95 | for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { | 121 | for (i = DCB_PFC_UP_ATTR_0; i < DCB_PFC_UP_ATTR_MAX; i++) { |
| 96 | dst_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc = | 122 | j = i - DCB_PFC_UP_ATTR_0; |
| 97 | src_dcb_cfg->tc_config[i - DCB_PFC_UP_ATTR_0].dcb_pfc; | 123 | if (dcfg->tc_config[j].dcb_pfc != scfg->tc_config[j].dcb_pfc) { |
| 124 | dcfg->tc_config[j].dcb_pfc = scfg->tc_config[j].dcb_pfc; | ||
| 125 | changes |= BIT_PFC; | ||
| 126 | } | ||
| 98 | } | 127 | } |
| 99 | 128 | ||
| 100 | dst_dcb_cfg->pfc_mode_enable = src_dcb_cfg->pfc_mode_enable; | 129 | if (dcfg->pfc_mode_enable != scfg->pfc_mode_enable) { |
| 130 | dcfg->pfc_mode_enable = scfg->pfc_mode_enable; | ||
| 131 | changes |= BIT_PFC; | ||
| 132 | } | ||
| 101 | 133 | ||
| 102 | return 0; | 134 | return changes; |
| 103 | } | 135 | } |
| 104 | 136 | ||
| 105 | static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) | 137 | static u8 ixgbe_dcbnl_get_state(struct net_device *netdev) |
| @@ -179,20 +211,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_tx(struct net_device *netdev, int tc, | |||
| 179 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) | 211 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) |
| 180 | adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = | 212 | adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap = |
| 181 | up_map; | 213 | up_map; |
| 182 | |||
| 183 | if ((adapter->temp_dcb_cfg.tc_config[tc].path[0].prio_type != | ||
| 184 | adapter->dcb_cfg.tc_config[tc].path[0].prio_type) || | ||
| 185 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_id != | ||
| 186 | adapter->dcb_cfg.tc_config[tc].path[0].bwg_id) || | ||
| 187 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].bwg_percent != | ||
| 188 | adapter->dcb_cfg.tc_config[tc].path[0].bwg_percent) || | ||
| 189 | (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != | ||
| 190 | adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap)) | ||
| 191 | adapter->dcb_set_bitmap |= BIT_PG_TX; | ||
| 192 | |||
| 193 | if (adapter->temp_dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap != | ||
| 194 | adapter->dcb_cfg.tc_config[tc].path[0].up_to_tc_bitmap) | ||
| 195 | adapter->dcb_set_bitmap |= BIT_PFC | BIT_APP_UPCHG; | ||
| 196 | } | 214 | } |
| 197 | 215 | ||
| 198 | static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | 216 | static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, |
| @@ -201,10 +219,6 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_tx(struct net_device *netdev, int bwg_id, | |||
| 201 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 219 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 202 | 220 | ||
| 203 | adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; | 221 | adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] = bw_pct; |
| 204 | |||
| 205 | if (adapter->temp_dcb_cfg.bw_percentage[0][bwg_id] != | ||
| 206 | adapter->dcb_cfg.bw_percentage[0][bwg_id]) | ||
| 207 | adapter->dcb_set_bitmap |= BIT_PG_TX; | ||
| 208 | } | 222 | } |
| 209 | 223 | ||
| 210 | static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, | 224 | static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, |
| @@ -223,20 +237,6 @@ static void ixgbe_dcbnl_set_pg_tc_cfg_rx(struct net_device *netdev, int tc, | |||
| 223 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) | 237 | if (up_map != DCB_ATTR_VALUE_UNDEFINED) |
| 224 | adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = | 238 | adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap = |
| 225 | up_map; | 239 | up_map; |
| 226 | |||
| 227 | if ((adapter->temp_dcb_cfg.tc_config[tc].path[1].prio_type != | ||
| 228 | adapter->dcb_cfg.tc_config[tc].path[1].prio_type) || | ||
| 229 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_id != | ||
| 230 | adapter->dcb_cfg.tc_config[tc].path[1].bwg_id) || | ||
| 231 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].bwg_percent != | ||
| 232 | adapter->dcb_cfg.tc_config[tc].path[1].bwg_percent) || | ||
| 233 | (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != | ||
| 234 | adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap)) | ||
| 235 | adapter->dcb_set_bitmap |= BIT_PG_RX; | ||
| 236 | |||
| 237 | if (adapter->temp_dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap != | ||
| 238 | adapter->dcb_cfg.tc_config[tc].path[1].up_to_tc_bitmap) | ||
| 239 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, | 242 | static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, |
| @@ -245,10 +245,6 @@ static void ixgbe_dcbnl_set_pg_bwg_cfg_rx(struct net_device *netdev, int bwg_id, | |||
| 245 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 245 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 246 | 246 | ||
| 247 | adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; | 247 | adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] = bw_pct; |
| 248 | |||
| 249 | if (adapter->temp_dcb_cfg.bw_percentage[1][bwg_id] != | ||
| 250 | adapter->dcb_cfg.bw_percentage[1][bwg_id]) | ||
| 251 | adapter->dcb_set_bitmap |= BIT_PG_RX; | ||
| 252 | } | 248 | } |
| 253 | 249 | ||
| 254 | static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, | 250 | static void ixgbe_dcbnl_get_pg_tc_cfg_tx(struct net_device *netdev, int tc, |
| @@ -298,10 +294,8 @@ static void ixgbe_dcbnl_set_pfc_cfg(struct net_device *netdev, int priority, | |||
| 298 | 294 | ||
| 299 | adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; | 295 | adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc = setting; |
| 300 | if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != | 296 | if (adapter->temp_dcb_cfg.tc_config[priority].dcb_pfc != |
| 301 | adapter->dcb_cfg.tc_config[priority].dcb_pfc) { | 297 | adapter->dcb_cfg.tc_config[priority].dcb_pfc) |
| 302 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
| 303 | adapter->temp_dcb_cfg.pfc_mode_enable = true; | 298 | adapter->temp_dcb_cfg.pfc_mode_enable = true; |
| 304 | } | ||
| 305 | } | 299 | } |
| 306 | 300 | ||
| 307 | static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, | 301 | static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority, |
| @@ -336,7 +330,8 @@ static void ixgbe_dcbnl_devreset(struct net_device *dev) | |||
| 336 | static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | 330 | static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) |
| 337 | { | 331 | { |
| 338 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 332 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 339 | int ret, i; | 333 | int ret = DCB_NO_HW_CHG; |
| 334 | int i; | ||
| 340 | #ifdef IXGBE_FCOE | 335 | #ifdef IXGBE_FCOE |
| 341 | struct dcb_app app = { | 336 | struct dcb_app app = { |
| 342 | .selector = DCB_APP_IDTYPE_ETHTYPE, | 337 | .selector = DCB_APP_IDTYPE_ETHTYPE, |
| @@ -355,12 +350,13 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 355 | 350 | ||
| 356 | /* Fail command if not in CEE mode */ | 351 | /* Fail command if not in CEE mode */ |
| 357 | if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) | 352 | if (!(adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE)) |
| 358 | return 1; | 353 | return ret; |
| 359 | 354 | ||
| 360 | ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg, | 355 | adapter->dcb_set_bitmap |= ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, |
| 361 | MAX_TRAFFIC_CLASS); | 356 | &adapter->dcb_cfg, |
| 362 | if (ret) | 357 | MAX_TRAFFIC_CLASS); |
| 363 | return DCB_NO_HW_CHG; | 358 | if (!adapter->dcb_set_bitmap) |
| 359 | return ret; | ||
| 364 | 360 | ||
| 365 | if (adapter->dcb_cfg.pfc_mode_enable) { | 361 | if (adapter->dcb_cfg.pfc_mode_enable) { |
| 366 | switch (adapter->hw.mac.type) { | 362 | switch (adapter->hw.mac.type) { |
| @@ -420,6 +416,8 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 420 | 416 | ||
| 421 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) | 417 | for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) |
| 422 | netdev_set_prio_tc_map(netdev, i, prio_tc[i]); | 418 | netdev_set_prio_tc_map(netdev, i, prio_tc[i]); |
| 419 | |||
| 420 | ret = DCB_HW_CHG_RST; | ||
| 423 | } | 421 | } |
| 424 | 422 | ||
| 425 | if (adapter->dcb_set_bitmap & BIT_PFC) { | 423 | if (adapter->dcb_set_bitmap & BIT_PFC) { |
| @@ -430,7 +428,8 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev) | |||
| 430 | DCB_TX_CONFIG, prio_tc); | 428 | DCB_TX_CONFIG, prio_tc); |
| 431 | ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en); | 429 | ixgbe_dcb_unpack_pfc(&adapter->dcb_cfg, &pfc_en); |
| 432 | ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en, prio_tc); | 430 | ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc_en, prio_tc); |
| 433 | ret = DCB_HW_CHG; | 431 | if (ret != DCB_HW_CHG_RST) |
| 432 | ret = DCB_HW_CHG; | ||
| 434 | } | 433 | } |
| 435 | 434 | ||
| 436 | if (adapter->dcb_cfg.pfc_mode_enable) | 435 | if (adapter->dcb_cfg.pfc_mode_enable) |
| @@ -531,9 +530,6 @@ static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state) | |||
| 531 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 530 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 532 | 531 | ||
| 533 | adapter->temp_dcb_cfg.pfc_mode_enable = state; | 532 | adapter->temp_dcb_cfg.pfc_mode_enable = state; |
| 534 | if (adapter->temp_dcb_cfg.pfc_mode_enable != | ||
| 535 | adapter->dcb_cfg.pfc_mode_enable) | ||
| 536 | adapter->dcb_set_bitmap |= BIT_PFC; | ||
| 537 | } | 533 | } |
| 538 | 534 | ||
| 539 | /** | 535 | /** |
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index b806d9b4defb..c9b504e2dfc3 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c | |||
| @@ -2469,6 +2469,17 @@ static int sky2_change_mtu(struct net_device *dev, int new_mtu) | |||
| 2469 | return err; | 2469 | return err; |
| 2470 | } | 2470 | } |
| 2471 | 2471 | ||
| 2472 | static inline bool needs_copy(const struct rx_ring_info *re, | ||
| 2473 | unsigned length) | ||
| 2474 | { | ||
| 2475 | #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
| 2476 | /* Some architectures need the IP header to be aligned */ | ||
| 2477 | if (!IS_ALIGNED(re->data_addr + ETH_HLEN, sizeof(u32))) | ||
| 2478 | return true; | ||
| 2479 | #endif | ||
| 2480 | return length < copybreak; | ||
| 2481 | } | ||
| 2482 | |||
| 2472 | /* For small just reuse existing skb for next receive */ | 2483 | /* For small just reuse existing skb for next receive */ |
| 2473 | static struct sk_buff *receive_copy(struct sky2_port *sky2, | 2484 | static struct sk_buff *receive_copy(struct sky2_port *sky2, |
| 2474 | const struct rx_ring_info *re, | 2485 | const struct rx_ring_info *re, |
| @@ -2599,7 +2610,7 @@ static struct sk_buff *sky2_receive(struct net_device *dev, | |||
| 2599 | goto error; | 2610 | goto error; |
| 2600 | 2611 | ||
| 2601 | okay: | 2612 | okay: |
| 2602 | if (length < copybreak) | 2613 | if (needs_copy(re, length)) |
| 2603 | skb = receive_copy(sky2, re, length); | 2614 | skb = receive_copy(sky2, re, length); |
| 2604 | else | 2615 | else |
| 2605 | skb = receive_new(sky2, re, length); | 2616 | skb = receive_new(sky2, re, length); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 9e2b911a1230..d69fee41f24a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -83,8 +83,9 @@ | |||
| 83 | 83 | ||
| 84 | #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) | 84 | #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) |
| 85 | 85 | ||
| 86 | #define MLX4_EN_ALLOC_ORDER 2 | 86 | /* Use the maximum between 16384 and a single page */ |
| 87 | #define MLX4_EN_ALLOC_SIZE (PAGE_SIZE << MLX4_EN_ALLOC_ORDER) | 87 | #define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384) |
| 88 | #define MLX4_EN_ALLOC_ORDER get_order(MLX4_EN_ALLOC_SIZE) | ||
| 88 | 89 | ||
| 89 | #define MLX4_EN_MAX_LRO_DESCRIPTORS 32 | 90 | #define MLX4_EN_MAX_LRO_DESCRIPTORS 32 |
| 90 | 91 | ||
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 7b23554f80b6..f54509377efa 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -5810,7 +5810,10 @@ static void __rtl8169_resume(struct net_device *dev) | |||
| 5810 | 5810 | ||
| 5811 | rtl_pll_power_up(tp); | 5811 | rtl_pll_power_up(tp); |
| 5812 | 5812 | ||
| 5813 | rtl_lock_work(tp); | ||
| 5814 | napi_enable(&tp->napi); | ||
| 5813 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); | 5815 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); |
| 5816 | rtl_unlock_work(tp); | ||
| 5814 | 5817 | ||
| 5815 | rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING); | 5818 | rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING); |
| 5816 | } | 5819 | } |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index e85ffbd54830..48d56da62f08 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -1737,10 +1737,12 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
| 1737 | struct mac_device_info *mac; | 1737 | struct mac_device_info *mac; |
| 1738 | 1738 | ||
| 1739 | /* Identify the MAC HW device */ | 1739 | /* Identify the MAC HW device */ |
| 1740 | if (priv->plat->has_gmac) | 1740 | if (priv->plat->has_gmac) { |
| 1741 | priv->dev->priv_flags |= IFF_UNICAST_FLT; | ||
| 1741 | mac = dwmac1000_setup(priv->ioaddr); | 1742 | mac = dwmac1000_setup(priv->ioaddr); |
| 1742 | else | 1743 | } else { |
| 1743 | mac = dwmac100_setup(priv->ioaddr); | 1744 | mac = dwmac100_setup(priv->ioaddr); |
| 1745 | } | ||
| 1744 | if (!mac) | 1746 | if (!mac) |
| 1745 | return -ENOMEM; | 1747 | return -ENOMEM; |
| 1746 | 1748 | ||
diff --git a/drivers/net/ethernet/tile/tilepro.c b/drivers/net/ethernet/tile/tilepro.c index 261356c2dc99..3d501ec7fad7 100644 --- a/drivers/net/ethernet/tile/tilepro.c +++ b/drivers/net/ethernet/tile/tilepro.c | |||
| @@ -342,6 +342,21 @@ inline int __netio_fastio1(u32 fastio_index, u32 arg0) | |||
| 342 | } | 342 | } |
| 343 | 343 | ||
| 344 | 344 | ||
| 345 | static void tile_net_return_credit(struct tile_net_cpu *info) | ||
| 346 | { | ||
| 347 | struct tile_netio_queue *queue = &info->queue; | ||
| 348 | netio_queue_user_impl_t *qup = &queue->__user_part; | ||
| 349 | |||
| 350 | /* Return four credits after every fourth packet. */ | ||
| 351 | if (--qup->__receive_credit_remaining == 0) { | ||
| 352 | u32 interval = qup->__receive_credit_interval; | ||
| 353 | qup->__receive_credit_remaining = interval; | ||
| 354 | __netio_fastio_return_credits(qup->__fastio_index, interval); | ||
| 355 | } | ||
| 356 | } | ||
| 357 | |||
| 358 | |||
| 359 | |||
| 345 | /* | 360 | /* |
| 346 | * Provide a linux buffer to LIPP. | 361 | * Provide a linux buffer to LIPP. |
| 347 | */ | 362 | */ |
| @@ -433,7 +448,7 @@ static bool tile_net_provide_needed_buffer(struct tile_net_cpu *info, | |||
| 433 | struct sk_buff **skb_ptr; | 448 | struct sk_buff **skb_ptr; |
| 434 | 449 | ||
| 435 | /* Request 96 extra bytes for alignment purposes. */ | 450 | /* Request 96 extra bytes for alignment purposes. */ |
| 436 | skb = netdev_alloc_skb(info->napi->dev, len + padding); | 451 | skb = netdev_alloc_skb(info->napi.dev, len + padding); |
| 437 | if (skb == NULL) | 452 | if (skb == NULL) |
| 438 | return false; | 453 | return false; |
| 439 | 454 | ||
| @@ -864,19 +879,11 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index) | |||
| 864 | 879 | ||
| 865 | stats->rx_packets++; | 880 | stats->rx_packets++; |
| 866 | stats->rx_bytes += len; | 881 | stats->rx_bytes += len; |
| 867 | |||
| 868 | if (small) | ||
| 869 | info->num_needed_small_buffers++; | ||
| 870 | else | ||
| 871 | info->num_needed_large_buffers++; | ||
| 872 | } | 882 | } |
| 873 | 883 | ||
| 874 | /* Return four credits after every fourth packet. */ | 884 | /* ISSUE: It would be nice to defer this until the packet has */ |
| 875 | if (--qup->__receive_credit_remaining == 0) { | 885 | /* actually been processed. */ |
| 876 | u32 interval = qup->__receive_credit_interval; | 886 | tile_net_return_credit(info); |
| 877 | qup->__receive_credit_remaining = interval; | ||
| 878 | __netio_fastio_return_credits(qup->__fastio_index, interval); | ||
| 879 | } | ||
| 880 | 887 | ||
| 881 | /* Consume this packet. */ | 888 | /* Consume this packet. */ |
| 882 | qup->__packet_receive_read = index2; | 889 | qup->__packet_receive_read = index2; |
| @@ -1543,7 +1550,7 @@ static int tile_net_drain_lipp_buffers(struct tile_net_priv *priv) | |||
| 1543 | 1550 | ||
| 1544 | /* Drain all the LIPP buffers. */ | 1551 | /* Drain all the LIPP buffers. */ |
| 1545 | while (true) { | 1552 | while (true) { |
| 1546 | int buffer; | 1553 | unsigned int buffer; |
| 1547 | 1554 | ||
| 1548 | /* NOTE: This should never fail. */ | 1555 | /* NOTE: This should never fail. */ |
| 1549 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&buffer, | 1556 | if (hv_dev_pread(priv->hv_devhdl, 0, (HV_VirtAddr)&buffer, |
| @@ -1707,7 +1714,7 @@ static unsigned int tile_net_tx_frags(lepp_frag_t *frags, | |||
| 1707 | if (!hash_default) { | 1714 | if (!hash_default) { |
| 1708 | void *va = pfn_to_kaddr(pfn) + f->page_offset; | 1715 | void *va = pfn_to_kaddr(pfn) + f->page_offset; |
| 1709 | BUG_ON(PageHighMem(skb_frag_page(f))); | 1716 | BUG_ON(PageHighMem(skb_frag_page(f))); |
| 1710 | finv_buffer_remote(va, f->size, 0); | 1717 | finv_buffer_remote(va, skb_frag_size(f), 0); |
| 1711 | } | 1718 | } |
| 1712 | 1719 | ||
| 1713 | cpa = ((phys_addr_t)pfn << PAGE_SHIFT) + f->page_offset; | 1720 | cpa = ((phys_addr_t)pfn << PAGE_SHIFT) + f->page_offset; |
| @@ -1735,8 +1742,8 @@ static unsigned int tile_net_tx_frags(lepp_frag_t *frags, | |||
| 1735 | * Sometimes, if "sendfile()" requires copying, we will be called with | 1742 | * Sometimes, if "sendfile()" requires copying, we will be called with |
| 1736 | * "data" containing the header and payload, with "frags" being empty. | 1743 | * "data" containing the header and payload, with "frags" being empty. |
| 1737 | * | 1744 | * |
| 1738 | * In theory, "sh->nr_frags" could be 3, but in practice, it seems | 1745 | * Sometimes, for example when using NFS over TCP, a single segment can |
| 1739 | * that this will never actually happen. | 1746 | * span 3 fragments, which must be handled carefully in LEPP. |
| 1740 | * | 1747 | * |
| 1741 | * See "emulate_large_send_offload()" for some reference code, which | 1748 | * See "emulate_large_send_offload()" for some reference code, which |
| 1742 | * does not handle checksumming. | 1749 | * does not handle checksumming. |
| @@ -1844,10 +1851,8 @@ static int tile_net_tx_tso(struct sk_buff *skb, struct net_device *dev) | |||
| 1844 | 1851 | ||
| 1845 | spin_lock_irqsave(&priv->eq_lock, irqflags); | 1852 | spin_lock_irqsave(&priv->eq_lock, irqflags); |
| 1846 | 1853 | ||
| 1847 | /* | 1854 | /* Handle completions if needed to make room. */ |
| 1848 | * Handle completions if needed to make room. | 1855 | /* NOTE: Return NETDEV_TX_BUSY if there is still no room. */ |
| 1849 | * HACK: Spin until there is sufficient room. | ||
| 1850 | */ | ||
| 1851 | if (lepp_num_free_comp_slots(eq) == 0) { | 1856 | if (lepp_num_free_comp_slots(eq) == 0) { |
| 1852 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); | 1857 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); |
| 1853 | if (nolds == 0) { | 1858 | if (nolds == 0) { |
| @@ -1861,6 +1866,7 @@ busy: | |||
| 1861 | cmd_tail = eq->cmd_tail; | 1866 | cmd_tail = eq->cmd_tail; |
| 1862 | 1867 | ||
| 1863 | /* Prepare to advance, detecting full queue. */ | 1868 | /* Prepare to advance, detecting full queue. */ |
| 1869 | /* NOTE: Return NETDEV_TX_BUSY if the queue is full. */ | ||
| 1864 | cmd_next = cmd_tail + cmd_size; | 1870 | cmd_next = cmd_tail + cmd_size; |
| 1865 | if (cmd_tail < cmd_head && cmd_next >= cmd_head) | 1871 | if (cmd_tail < cmd_head && cmd_next >= cmd_head) |
| 1866 | goto busy; | 1872 | goto busy; |
| @@ -2023,10 +2029,8 @@ static int tile_net_tx(struct sk_buff *skb, struct net_device *dev) | |||
| 2023 | 2029 | ||
| 2024 | spin_lock_irqsave(&priv->eq_lock, irqflags); | 2030 | spin_lock_irqsave(&priv->eq_lock, irqflags); |
| 2025 | 2031 | ||
| 2026 | /* | 2032 | /* Handle completions if needed to make room. */ |
| 2027 | * Handle completions if needed to make room. | 2033 | /* NOTE: Return NETDEV_TX_BUSY if there is still no room. */ |
| 2028 | * HACK: Spin until there is sufficient room. | ||
| 2029 | */ | ||
| 2030 | if (lepp_num_free_comp_slots(eq) == 0) { | 2034 | if (lepp_num_free_comp_slots(eq) == 0) { |
| 2031 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); | 2035 | nolds = tile_net_lepp_grab_comps(eq, olds, wanted, 0); |
| 2032 | if (nolds == 0) { | 2036 | if (nolds == 0) { |
| @@ -2040,6 +2044,7 @@ busy: | |||
| 2040 | cmd_tail = eq->cmd_tail; | 2044 | cmd_tail = eq->cmd_tail; |
| 2041 | 2045 | ||
| 2042 | /* Copy the commands, or fail. */ | 2046 | /* Copy the commands, or fail. */ |
| 2047 | /* NOTE: Return NETDEV_TX_BUSY if the queue is full. */ | ||
| 2043 | for (i = 0; i < num_frags; i++) { | 2048 | for (i = 0; i < num_frags; i++) { |
| 2044 | 2049 | ||
| 2045 | /* Prepare to advance, detecting full queue. */ | 2050 | /* Prepare to advance, detecting full queue. */ |
| @@ -2261,6 +2266,23 @@ static int tile_net_get_mac(struct net_device *dev) | |||
| 2261 | return 0; | 2266 | return 0; |
| 2262 | } | 2267 | } |
| 2263 | 2268 | ||
| 2269 | |||
| 2270 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 2271 | /* | ||
| 2272 | * Polling 'interrupt' - used by things like netconsole to send skbs | ||
| 2273 | * without having to re-enable interrupts. It's not called while | ||
| 2274 | * the interrupt routine is executing. | ||
| 2275 | */ | ||
| 2276 | static void tile_net_netpoll(struct net_device *dev) | ||
| 2277 | { | ||
| 2278 | struct tile_net_priv *priv = netdev_priv(dev); | ||
| 2279 | disable_percpu_irq(priv->intr_id); | ||
| 2280 | tile_net_handle_ingress_interrupt(priv->intr_id, dev); | ||
| 2281 | enable_percpu_irq(priv->intr_id, 0); | ||
| 2282 | } | ||
| 2283 | #endif | ||
| 2284 | |||
| 2285 | |||
| 2264 | static const struct net_device_ops tile_net_ops = { | 2286 | static const struct net_device_ops tile_net_ops = { |
| 2265 | .ndo_open = tile_net_open, | 2287 | .ndo_open = tile_net_open, |
| 2266 | .ndo_stop = tile_net_stop, | 2288 | .ndo_stop = tile_net_stop, |
| @@ -2269,7 +2291,10 @@ static const struct net_device_ops tile_net_ops = { | |||
| 2269 | .ndo_get_stats = tile_net_get_stats, | 2291 | .ndo_get_stats = tile_net_get_stats, |
| 2270 | .ndo_change_mtu = tile_net_change_mtu, | 2292 | .ndo_change_mtu = tile_net_change_mtu, |
| 2271 | .ndo_tx_timeout = tile_net_tx_timeout, | 2293 | .ndo_tx_timeout = tile_net_tx_timeout, |
| 2272 | .ndo_set_mac_address = tile_net_set_mac_address | 2294 | .ndo_set_mac_address = tile_net_set_mac_address, |
| 2295 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 2296 | .ndo_poll_controller = tile_net_netpoll, | ||
| 2297 | #endif | ||
| 2273 | }; | 2298 | }; |
| 2274 | 2299 | ||
| 2275 | 2300 | ||
| @@ -2409,7 +2434,7 @@ static void tile_net_cleanup(void) | |||
| 2409 | */ | 2434 | */ |
| 2410 | static int tile_net_init_module(void) | 2435 | static int tile_net_init_module(void) |
| 2411 | { | 2436 | { |
| 2412 | pr_info("Tilera IPP Net Driver\n"); | 2437 | pr_info("Tilera Network Driver\n"); |
| 2413 | 2438 | ||
| 2414 | tile_net_devs[0] = tile_net_dev_init("xgbe0"); | 2439 | tile_net_devs[0] = tile_net_dev_init("xgbe0"); |
| 2415 | tile_net_devs[1] = tile_net_dev_init("xgbe1"); | 2440 | tile_net_devs[1] = tile_net_dev_init("xgbe1"); |
diff --git a/drivers/net/phy/icplus.c b/drivers/net/phy/icplus.c index 0856e1b7a849..f08c85acf761 100644 --- a/drivers/net/phy/icplus.c +++ b/drivers/net/phy/icplus.c | |||
| @@ -162,7 +162,8 @@ static int ip101a_g_config_init(struct phy_device *phydev) | |||
| 162 | /* Enable Auto Power Saving mode */ | 162 | /* Enable Auto Power Saving mode */ |
| 163 | c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS); | 163 | c = phy_read(phydev, IP10XX_SPEC_CTRL_STATUS); |
| 164 | c |= IP101A_G_APS_ON; | 164 | c |= IP101A_G_APS_ON; |
| 165 | return c; | 165 | |
| 166 | return phy_write(phydev, IP10XX_SPEC_CTRL_STATUS, c); | ||
| 166 | } | 167 | } |
| 167 | 168 | ||
| 168 | static int ip175c_read_status(struct phy_device *phydev) | 169 | static int ip175c_read_status(struct phy_device *phydev) |
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 159da2905fe9..33f8c51968b6 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c | |||
| @@ -235,7 +235,7 @@ struct ppp_net { | |||
| 235 | /* Prototypes. */ | 235 | /* Prototypes. */ |
| 236 | static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | 236 | static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, |
| 237 | struct file *file, unsigned int cmd, unsigned long arg); | 237 | struct file *file, unsigned int cmd, unsigned long arg); |
| 238 | static void ppp_xmit_process(struct ppp *ppp); | 238 | static int ppp_xmit_process(struct ppp *ppp); |
| 239 | static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); | 239 | static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); |
| 240 | static void ppp_push(struct ppp *ppp); | 240 | static void ppp_push(struct ppp *ppp); |
| 241 | static void ppp_channel_push(struct channel *pch); | 241 | static void ppp_channel_push(struct channel *pch); |
| @@ -968,9 +968,9 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 968 | proto = npindex_to_proto[npi]; | 968 | proto = npindex_to_proto[npi]; |
| 969 | put_unaligned_be16(proto, pp); | 969 | put_unaligned_be16(proto, pp); |
| 970 | 970 | ||
| 971 | netif_stop_queue(dev); | ||
| 972 | skb_queue_tail(&ppp->file.xq, skb); | 971 | skb_queue_tail(&ppp->file.xq, skb); |
| 973 | ppp_xmit_process(ppp); | 972 | if (!ppp_xmit_process(ppp)) |
| 973 | netif_stop_queue(dev); | ||
| 974 | return NETDEV_TX_OK; | 974 | return NETDEV_TX_OK; |
| 975 | 975 | ||
| 976 | outf: | 976 | outf: |
| @@ -1048,10 +1048,11 @@ static void ppp_setup(struct net_device *dev) | |||
| 1048 | * Called to do any work queued up on the transmit side | 1048 | * Called to do any work queued up on the transmit side |
| 1049 | * that can now be done. | 1049 | * that can now be done. |
| 1050 | */ | 1050 | */ |
| 1051 | static void | 1051 | static int |
| 1052 | ppp_xmit_process(struct ppp *ppp) | 1052 | ppp_xmit_process(struct ppp *ppp) |
| 1053 | { | 1053 | { |
| 1054 | struct sk_buff *skb; | 1054 | struct sk_buff *skb; |
| 1055 | int ret = 0; | ||
| 1055 | 1056 | ||
| 1056 | ppp_xmit_lock(ppp); | 1057 | ppp_xmit_lock(ppp); |
| 1057 | if (!ppp->closing) { | 1058 | if (!ppp->closing) { |
| @@ -1061,10 +1062,13 @@ ppp_xmit_process(struct ppp *ppp) | |||
| 1061 | ppp_send_frame(ppp, skb); | 1062 | ppp_send_frame(ppp, skb); |
| 1062 | /* If there's no work left to do, tell the core net | 1063 | /* If there's no work left to do, tell the core net |
| 1063 | code that we can accept some more. */ | 1064 | code that we can accept some more. */ |
| 1064 | if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) | 1065 | if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) { |
| 1065 | netif_wake_queue(ppp->dev); | 1066 | netif_wake_queue(ppp->dev); |
| 1067 | ret = 1; | ||
| 1068 | } | ||
| 1066 | } | 1069 | } |
| 1067 | ppp_xmit_unlock(ppp); | 1070 | ppp_xmit_unlock(ppp); |
| 1071 | return ret; | ||
| 1068 | } | 1072 | } |
| 1069 | 1073 | ||
| 1070 | static inline struct sk_buff * | 1074 | static inline struct sk_buff * |
diff --git a/drivers/net/wimax/i2400m/debugfs.c b/drivers/net/wimax/i2400m/debugfs.c index 129ba36bd04d..4b66ab1d0e5c 100644 --- a/drivers/net/wimax/i2400m/debugfs.c +++ b/drivers/net/wimax/i2400m/debugfs.c | |||
| @@ -53,17 +53,6 @@ struct dentry *debugfs_create_netdev_queue_stopped( | |||
| 53 | &fops_netdev_queue_stopped); | 53 | &fops_netdev_queue_stopped); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | |||
| 57 | /* | ||
| 58 | * inode->i_private has the @data argument to debugfs_create_file() | ||
| 59 | */ | ||
| 60 | static | ||
| 61 | int i2400m_stats_open(struct inode *inode, struct file *filp) | ||
| 62 | { | ||
| 63 | filp->private_data = inode->i_private; | ||
| 64 | return 0; | ||
| 65 | } | ||
| 66 | |||
| 67 | /* | 56 | /* |
| 68 | * We don't allow partial reads of this file, as then the reader would | 57 | * We don't allow partial reads of this file, as then the reader would |
| 69 | * get weirdly confused data as it is updated. | 58 | * get weirdly confused data as it is updated. |
| @@ -117,7 +106,7 @@ ssize_t i2400m_rx_stats_write(struct file *filp, const char __user *buffer, | |||
| 117 | static | 106 | static |
| 118 | const struct file_operations i2400m_rx_stats_fops = { | 107 | const struct file_operations i2400m_rx_stats_fops = { |
| 119 | .owner = THIS_MODULE, | 108 | .owner = THIS_MODULE, |
| 120 | .open = i2400m_stats_open, | 109 | .open = simple_open, |
| 121 | .read = i2400m_rx_stats_read, | 110 | .read = i2400m_rx_stats_read, |
| 122 | .write = i2400m_rx_stats_write, | 111 | .write = i2400m_rx_stats_write, |
| 123 | .llseek = default_llseek, | 112 | .llseek = default_llseek, |
| @@ -170,7 +159,7 @@ ssize_t i2400m_tx_stats_write(struct file *filp, const char __user *buffer, | |||
| 170 | static | 159 | static |
| 171 | const struct file_operations i2400m_tx_stats_fops = { | 160 | const struct file_operations i2400m_tx_stats_fops = { |
| 172 | .owner = THIS_MODULE, | 161 | .owner = THIS_MODULE, |
| 173 | .open = i2400m_stats_open, | 162 | .open = simple_open, |
| 174 | .read = i2400m_tx_stats_read, | 163 | .read = i2400m_tx_stats_read, |
| 175 | .write = i2400m_tx_stats_write, | 164 | .write = i2400m_tx_stats_write, |
| 176 | .llseek = default_llseek, | 165 | .llseek = default_llseek, |
diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c index 8c5ce8b0c734..e5e8f45d86ac 100644 --- a/drivers/net/wireless/ath/ath5k/debug.c +++ b/drivers/net/wireless/ath/ath5k/debug.c | |||
| @@ -71,13 +71,6 @@ static unsigned int ath5k_debug; | |||
| 71 | module_param_named(debug, ath5k_debug, uint, 0); | 71 | module_param_named(debug, ath5k_debug, uint, 0); |
| 72 | 72 | ||
| 73 | 73 | ||
| 74 | static int ath5k_debugfs_open(struct inode *inode, struct file *file) | ||
| 75 | { | ||
| 76 | file->private_data = inode->i_private; | ||
| 77 | return 0; | ||
| 78 | } | ||
| 79 | |||
| 80 | |||
| 81 | /* debugfs: registers */ | 74 | /* debugfs: registers */ |
| 82 | 75 | ||
| 83 | struct reg { | 76 | struct reg { |
| @@ -265,7 +258,7 @@ static ssize_t write_file_beacon(struct file *file, | |||
| 265 | static const struct file_operations fops_beacon = { | 258 | static const struct file_operations fops_beacon = { |
| 266 | .read = read_file_beacon, | 259 | .read = read_file_beacon, |
| 267 | .write = write_file_beacon, | 260 | .write = write_file_beacon, |
| 268 | .open = ath5k_debugfs_open, | 261 | .open = simple_open, |
| 269 | .owner = THIS_MODULE, | 262 | .owner = THIS_MODULE, |
| 270 | .llseek = default_llseek, | 263 | .llseek = default_llseek, |
| 271 | }; | 264 | }; |
| @@ -285,7 +278,7 @@ static ssize_t write_file_reset(struct file *file, | |||
| 285 | 278 | ||
| 286 | static const struct file_operations fops_reset = { | 279 | static const struct file_operations fops_reset = { |
| 287 | .write = write_file_reset, | 280 | .write = write_file_reset, |
| 288 | .open = ath5k_debugfs_open, | 281 | .open = simple_open, |
| 289 | .owner = THIS_MODULE, | 282 | .owner = THIS_MODULE, |
| 290 | .llseek = noop_llseek, | 283 | .llseek = noop_llseek, |
| 291 | }; | 284 | }; |
| @@ -365,7 +358,7 @@ static ssize_t write_file_debug(struct file *file, | |||
| 365 | static const struct file_operations fops_debug = { | 358 | static const struct file_operations fops_debug = { |
| 366 | .read = read_file_debug, | 359 | .read = read_file_debug, |
| 367 | .write = write_file_debug, | 360 | .write = write_file_debug, |
| 368 | .open = ath5k_debugfs_open, | 361 | .open = simple_open, |
| 369 | .owner = THIS_MODULE, | 362 | .owner = THIS_MODULE, |
| 370 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
| 371 | }; | 364 | }; |
| @@ -477,7 +470,7 @@ static ssize_t write_file_antenna(struct file *file, | |||
| 477 | static const struct file_operations fops_antenna = { | 470 | static const struct file_operations fops_antenna = { |
| 478 | .read = read_file_antenna, | 471 | .read = read_file_antenna, |
| 479 | .write = write_file_antenna, | 472 | .write = write_file_antenna, |
| 480 | .open = ath5k_debugfs_open, | 473 | .open = simple_open, |
| 481 | .owner = THIS_MODULE, | 474 | .owner = THIS_MODULE, |
| 482 | .llseek = default_llseek, | 475 | .llseek = default_llseek, |
| 483 | }; | 476 | }; |
| @@ -532,7 +525,7 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf, | |||
| 532 | 525 | ||
| 533 | static const struct file_operations fops_misc = { | 526 | static const struct file_operations fops_misc = { |
| 534 | .read = read_file_misc, | 527 | .read = read_file_misc, |
| 535 | .open = ath5k_debugfs_open, | 528 | .open = simple_open, |
| 536 | .owner = THIS_MODULE, | 529 | .owner = THIS_MODULE, |
| 537 | }; | 530 | }; |
| 538 | 531 | ||
| @@ -647,7 +640,7 @@ static ssize_t write_file_frameerrors(struct file *file, | |||
| 647 | static const struct file_operations fops_frameerrors = { | 640 | static const struct file_operations fops_frameerrors = { |
| 648 | .read = read_file_frameerrors, | 641 | .read = read_file_frameerrors, |
| 649 | .write = write_file_frameerrors, | 642 | .write = write_file_frameerrors, |
| 650 | .open = ath5k_debugfs_open, | 643 | .open = simple_open, |
| 651 | .owner = THIS_MODULE, | 644 | .owner = THIS_MODULE, |
| 652 | .llseek = default_llseek, | 645 | .llseek = default_llseek, |
| 653 | }; | 646 | }; |
| @@ -810,7 +803,7 @@ static ssize_t write_file_ani(struct file *file, | |||
| 810 | static const struct file_operations fops_ani = { | 803 | static const struct file_operations fops_ani = { |
| 811 | .read = read_file_ani, | 804 | .read = read_file_ani, |
| 812 | .write = write_file_ani, | 805 | .write = write_file_ani, |
| 813 | .open = ath5k_debugfs_open, | 806 | .open = simple_open, |
| 814 | .owner = THIS_MODULE, | 807 | .owner = THIS_MODULE, |
| 815 | .llseek = default_llseek, | 808 | .llseek = default_llseek, |
| 816 | }; | 809 | }; |
| @@ -881,7 +874,7 @@ static ssize_t write_file_queue(struct file *file, | |||
| 881 | static const struct file_operations fops_queue = { | 874 | static const struct file_operations fops_queue = { |
| 882 | .read = read_file_queue, | 875 | .read = read_file_queue, |
| 883 | .write = write_file_queue, | 876 | .write = write_file_queue, |
| 884 | .open = ath5k_debugfs_open, | 877 | .open = simple_open, |
| 885 | .owner = THIS_MODULE, | 878 | .owner = THIS_MODULE, |
| 886 | .llseek = default_llseek, | 879 | .llseek = default_llseek, |
| 887 | }; | 880 | }; |
diff --git a/drivers/net/wireless/ath/ath6kl/debug.c b/drivers/net/wireless/ath/ath6kl/debug.c index 552adb3f80d0..d01403a263ff 100644 --- a/drivers/net/wireless/ath/ath6kl/debug.c +++ b/drivers/net/wireless/ath/ath6kl/debug.c | |||
| @@ -217,12 +217,6 @@ void dump_cred_dist_stats(struct htc_target *target) | |||
| 217 | target->credit_info->cur_free_credits); | 217 | target->credit_info->cur_free_credits); |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | static int ath6kl_debugfs_open(struct inode *inode, struct file *file) | ||
| 221 | { | ||
| 222 | file->private_data = inode->i_private; | ||
| 223 | return 0; | ||
| 224 | } | ||
| 225 | |||
| 226 | void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) | 220 | void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war) |
| 227 | { | 221 | { |
| 228 | switch (war) { | 222 | switch (war) { |
| @@ -263,7 +257,7 @@ static ssize_t read_file_war_stats(struct file *file, char __user *user_buf, | |||
| 263 | 257 | ||
| 264 | static const struct file_operations fops_war_stats = { | 258 | static const struct file_operations fops_war_stats = { |
| 265 | .read = read_file_war_stats, | 259 | .read = read_file_war_stats, |
| 266 | .open = ath6kl_debugfs_open, | 260 | .open = simple_open, |
| 267 | .owner = THIS_MODULE, | 261 | .owner = THIS_MODULE, |
| 268 | .llseek = default_llseek, | 262 | .llseek = default_llseek, |
| 269 | }; | 263 | }; |
| @@ -488,7 +482,7 @@ static ssize_t ath6kl_fwlog_mask_write(struct file *file, | |||
| 488 | } | 482 | } |
| 489 | 483 | ||
| 490 | static const struct file_operations fops_fwlog_mask = { | 484 | static const struct file_operations fops_fwlog_mask = { |
| 491 | .open = ath6kl_debugfs_open, | 485 | .open = simple_open, |
| 492 | .read = ath6kl_fwlog_mask_read, | 486 | .read = ath6kl_fwlog_mask_read, |
| 493 | .write = ath6kl_fwlog_mask_write, | 487 | .write = ath6kl_fwlog_mask_write, |
| 494 | .owner = THIS_MODULE, | 488 | .owner = THIS_MODULE, |
| @@ -634,7 +628,7 @@ static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf, | |||
| 634 | 628 | ||
| 635 | static const struct file_operations fops_tgt_stats = { | 629 | static const struct file_operations fops_tgt_stats = { |
| 636 | .read = read_file_tgt_stats, | 630 | .read = read_file_tgt_stats, |
| 637 | .open = ath6kl_debugfs_open, | 631 | .open = simple_open, |
| 638 | .owner = THIS_MODULE, | 632 | .owner = THIS_MODULE, |
| 639 | .llseek = default_llseek, | 633 | .llseek = default_llseek, |
| 640 | }; | 634 | }; |
| @@ -699,7 +693,7 @@ static ssize_t read_file_credit_dist_stats(struct file *file, | |||
| 699 | 693 | ||
| 700 | static const struct file_operations fops_credit_dist_stats = { | 694 | static const struct file_operations fops_credit_dist_stats = { |
| 701 | .read = read_file_credit_dist_stats, | 695 | .read = read_file_credit_dist_stats, |
| 702 | .open = ath6kl_debugfs_open, | 696 | .open = simple_open, |
| 703 | .owner = THIS_MODULE, | 697 | .owner = THIS_MODULE, |
| 704 | .llseek = default_llseek, | 698 | .llseek = default_llseek, |
| 705 | }; | 699 | }; |
| @@ -802,7 +796,7 @@ static ssize_t ath6kl_endpoint_stats_write(struct file *file, | |||
| 802 | } | 796 | } |
| 803 | 797 | ||
| 804 | static const struct file_operations fops_endpoint_stats = { | 798 | static const struct file_operations fops_endpoint_stats = { |
| 805 | .open = ath6kl_debugfs_open, | 799 | .open = simple_open, |
| 806 | .read = ath6kl_endpoint_stats_read, | 800 | .read = ath6kl_endpoint_stats_read, |
| 807 | .write = ath6kl_endpoint_stats_write, | 801 | .write = ath6kl_endpoint_stats_write, |
| 808 | .owner = THIS_MODULE, | 802 | .owner = THIS_MODULE, |
| @@ -875,7 +869,7 @@ static ssize_t ath6kl_regread_write(struct file *file, | |||
| 875 | static const struct file_operations fops_diag_reg_read = { | 869 | static const struct file_operations fops_diag_reg_read = { |
| 876 | .read = ath6kl_regread_read, | 870 | .read = ath6kl_regread_read, |
| 877 | .write = ath6kl_regread_write, | 871 | .write = ath6kl_regread_write, |
| 878 | .open = ath6kl_debugfs_open, | 872 | .open = simple_open, |
| 879 | .owner = THIS_MODULE, | 873 | .owner = THIS_MODULE, |
| 880 | .llseek = default_llseek, | 874 | .llseek = default_llseek, |
| 881 | }; | 875 | }; |
| @@ -999,7 +993,7 @@ static ssize_t ath6kl_lrssi_roam_read(struct file *file, | |||
| 999 | static const struct file_operations fops_lrssi_roam_threshold = { | 993 | static const struct file_operations fops_lrssi_roam_threshold = { |
| 1000 | .read = ath6kl_lrssi_roam_read, | 994 | .read = ath6kl_lrssi_roam_read, |
| 1001 | .write = ath6kl_lrssi_roam_write, | 995 | .write = ath6kl_lrssi_roam_write, |
| 1002 | .open = ath6kl_debugfs_open, | 996 | .open = simple_open, |
| 1003 | .owner = THIS_MODULE, | 997 | .owner = THIS_MODULE, |
| 1004 | .llseek = default_llseek, | 998 | .llseek = default_llseek, |
| 1005 | }; | 999 | }; |
| @@ -1061,7 +1055,7 @@ static ssize_t ath6kl_regwrite_write(struct file *file, | |||
| 1061 | static const struct file_operations fops_diag_reg_write = { | 1055 | static const struct file_operations fops_diag_reg_write = { |
| 1062 | .read = ath6kl_regwrite_read, | 1056 | .read = ath6kl_regwrite_read, |
| 1063 | .write = ath6kl_regwrite_write, | 1057 | .write = ath6kl_regwrite_write, |
| 1064 | .open = ath6kl_debugfs_open, | 1058 | .open = simple_open, |
| 1065 | .owner = THIS_MODULE, | 1059 | .owner = THIS_MODULE, |
| 1066 | .llseek = default_llseek, | 1060 | .llseek = default_llseek, |
| 1067 | }; | 1061 | }; |
| @@ -1166,7 +1160,7 @@ static ssize_t ath6kl_roam_table_read(struct file *file, char __user *user_buf, | |||
| 1166 | 1160 | ||
| 1167 | static const struct file_operations fops_roam_table = { | 1161 | static const struct file_operations fops_roam_table = { |
| 1168 | .read = ath6kl_roam_table_read, | 1162 | .read = ath6kl_roam_table_read, |
| 1169 | .open = ath6kl_debugfs_open, | 1163 | .open = simple_open, |
| 1170 | .owner = THIS_MODULE, | 1164 | .owner = THIS_MODULE, |
| 1171 | .llseek = default_llseek, | 1165 | .llseek = default_llseek, |
| 1172 | }; | 1166 | }; |
| @@ -1204,7 +1198,7 @@ static ssize_t ath6kl_force_roam_write(struct file *file, | |||
| 1204 | 1198 | ||
| 1205 | static const struct file_operations fops_force_roam = { | 1199 | static const struct file_operations fops_force_roam = { |
| 1206 | .write = ath6kl_force_roam_write, | 1200 | .write = ath6kl_force_roam_write, |
| 1207 | .open = ath6kl_debugfs_open, | 1201 | .open = simple_open, |
| 1208 | .owner = THIS_MODULE, | 1202 | .owner = THIS_MODULE, |
| 1209 | .llseek = default_llseek, | 1203 | .llseek = default_llseek, |
| 1210 | }; | 1204 | }; |
| @@ -1244,7 +1238,7 @@ static ssize_t ath6kl_roam_mode_write(struct file *file, | |||
| 1244 | 1238 | ||
| 1245 | static const struct file_operations fops_roam_mode = { | 1239 | static const struct file_operations fops_roam_mode = { |
| 1246 | .write = ath6kl_roam_mode_write, | 1240 | .write = ath6kl_roam_mode_write, |
| 1247 | .open = ath6kl_debugfs_open, | 1241 | .open = simple_open, |
| 1248 | .owner = THIS_MODULE, | 1242 | .owner = THIS_MODULE, |
| 1249 | .llseek = default_llseek, | 1243 | .llseek = default_llseek, |
| 1250 | }; | 1244 | }; |
| @@ -1286,7 +1280,7 @@ static ssize_t ath6kl_keepalive_write(struct file *file, | |||
| 1286 | } | 1280 | } |
| 1287 | 1281 | ||
| 1288 | static const struct file_operations fops_keepalive = { | 1282 | static const struct file_operations fops_keepalive = { |
| 1289 | .open = ath6kl_debugfs_open, | 1283 | .open = simple_open, |
| 1290 | .read = ath6kl_keepalive_read, | 1284 | .read = ath6kl_keepalive_read, |
| 1291 | .write = ath6kl_keepalive_write, | 1285 | .write = ath6kl_keepalive_write, |
| 1292 | .owner = THIS_MODULE, | 1286 | .owner = THIS_MODULE, |
| @@ -1331,7 +1325,7 @@ static ssize_t ath6kl_disconnect_timeout_write(struct file *file, | |||
| 1331 | } | 1325 | } |
| 1332 | 1326 | ||
| 1333 | static const struct file_operations fops_disconnect_timeout = { | 1327 | static const struct file_operations fops_disconnect_timeout = { |
| 1334 | .open = ath6kl_debugfs_open, | 1328 | .open = simple_open, |
| 1335 | .read = ath6kl_disconnect_timeout_read, | 1329 | .read = ath6kl_disconnect_timeout_read, |
| 1336 | .write = ath6kl_disconnect_timeout_write, | 1330 | .write = ath6kl_disconnect_timeout_write, |
| 1337 | .owner = THIS_MODULE, | 1331 | .owner = THIS_MODULE, |
| @@ -1512,7 +1506,7 @@ static ssize_t ath6kl_create_qos_write(struct file *file, | |||
| 1512 | 1506 | ||
| 1513 | static const struct file_operations fops_create_qos = { | 1507 | static const struct file_operations fops_create_qos = { |
| 1514 | .write = ath6kl_create_qos_write, | 1508 | .write = ath6kl_create_qos_write, |
| 1515 | .open = ath6kl_debugfs_open, | 1509 | .open = simple_open, |
| 1516 | .owner = THIS_MODULE, | 1510 | .owner = THIS_MODULE, |
| 1517 | .llseek = default_llseek, | 1511 | .llseek = default_llseek, |
| 1518 | }; | 1512 | }; |
| @@ -1560,7 +1554,7 @@ static ssize_t ath6kl_delete_qos_write(struct file *file, | |||
| 1560 | 1554 | ||
| 1561 | static const struct file_operations fops_delete_qos = { | 1555 | static const struct file_operations fops_delete_qos = { |
| 1562 | .write = ath6kl_delete_qos_write, | 1556 | .write = ath6kl_delete_qos_write, |
| 1563 | .open = ath6kl_debugfs_open, | 1557 | .open = simple_open, |
| 1564 | .owner = THIS_MODULE, | 1558 | .owner = THIS_MODULE, |
| 1565 | .llseek = default_llseek, | 1559 | .llseek = default_llseek, |
| 1566 | }; | 1560 | }; |
| @@ -1593,7 +1587,7 @@ static ssize_t ath6kl_bgscan_int_write(struct file *file, | |||
| 1593 | 1587 | ||
| 1594 | static const struct file_operations fops_bgscan_int = { | 1588 | static const struct file_operations fops_bgscan_int = { |
| 1595 | .write = ath6kl_bgscan_int_write, | 1589 | .write = ath6kl_bgscan_int_write, |
| 1596 | .open = ath6kl_debugfs_open, | 1590 | .open = simple_open, |
| 1597 | .owner = THIS_MODULE, | 1591 | .owner = THIS_MODULE, |
| 1598 | .llseek = default_llseek, | 1592 | .llseek = default_llseek, |
| 1599 | }; | 1593 | }; |
| @@ -1651,7 +1645,7 @@ static ssize_t ath6kl_listen_int_read(struct file *file, | |||
| 1651 | static const struct file_operations fops_listen_int = { | 1645 | static const struct file_operations fops_listen_int = { |
| 1652 | .read = ath6kl_listen_int_read, | 1646 | .read = ath6kl_listen_int_read, |
| 1653 | .write = ath6kl_listen_int_write, | 1647 | .write = ath6kl_listen_int_write, |
| 1654 | .open = ath6kl_debugfs_open, | 1648 | .open = simple_open, |
| 1655 | .owner = THIS_MODULE, | 1649 | .owner = THIS_MODULE, |
| 1656 | .llseek = default_llseek, | 1650 | .llseek = default_llseek, |
| 1657 | }; | 1651 | }; |
| @@ -1711,7 +1705,7 @@ static ssize_t ath6kl_power_params_write(struct file *file, | |||
| 1711 | 1705 | ||
| 1712 | static const struct file_operations fops_power_params = { | 1706 | static const struct file_operations fops_power_params = { |
| 1713 | .write = ath6kl_power_params_write, | 1707 | .write = ath6kl_power_params_write, |
| 1714 | .open = ath6kl_debugfs_open, | 1708 | .open = simple_open, |
| 1715 | .owner = THIS_MODULE, | 1709 | .owner = THIS_MODULE, |
| 1716 | .llseek = default_llseek, | 1710 | .llseek = default_llseek, |
| 1717 | }; | 1711 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 35d1c8e91d1c..ff47b32ecaf4 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
| @@ -26,11 +26,6 @@ | |||
| 26 | #define REG_READ_D(_ah, _reg) \ | 26 | #define REG_READ_D(_ah, _reg) \ |
| 27 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) | 27 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) |
| 28 | 28 | ||
| 29 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
| 30 | { | ||
| 31 | file->private_data = inode->i_private; | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | 29 | ||
| 35 | static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, | 30 | static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf, |
| 36 | size_t count, loff_t *ppos) | 31 | size_t count, loff_t *ppos) |
| @@ -83,7 +78,7 @@ static ssize_t write_file_debug(struct file *file, const char __user *user_buf, | |||
| 83 | static const struct file_operations fops_debug = { | 78 | static const struct file_operations fops_debug = { |
| 84 | .read = read_file_debug, | 79 | .read = read_file_debug, |
| 85 | .write = write_file_debug, | 80 | .write = write_file_debug, |
| 86 | .open = ath9k_debugfs_open, | 81 | .open = simple_open, |
| 87 | .owner = THIS_MODULE, | 82 | .owner = THIS_MODULE, |
| 88 | .llseek = default_llseek, | 83 | .llseek = default_llseek, |
| 89 | }; | 84 | }; |
| @@ -129,7 +124,7 @@ static ssize_t write_file_tx_chainmask(struct file *file, const char __user *use | |||
| 129 | static const struct file_operations fops_tx_chainmask = { | 124 | static const struct file_operations fops_tx_chainmask = { |
| 130 | .read = read_file_tx_chainmask, | 125 | .read = read_file_tx_chainmask, |
| 131 | .write = write_file_tx_chainmask, | 126 | .write = write_file_tx_chainmask, |
| 132 | .open = ath9k_debugfs_open, | 127 | .open = simple_open, |
| 133 | .owner = THIS_MODULE, | 128 | .owner = THIS_MODULE, |
| 134 | .llseek = default_llseek, | 129 | .llseek = default_llseek, |
| 135 | }; | 130 | }; |
| @@ -172,7 +167,7 @@ static ssize_t write_file_rx_chainmask(struct file *file, const char __user *use | |||
| 172 | static const struct file_operations fops_rx_chainmask = { | 167 | static const struct file_operations fops_rx_chainmask = { |
| 173 | .read = read_file_rx_chainmask, | 168 | .read = read_file_rx_chainmask, |
| 174 | .write = write_file_rx_chainmask, | 169 | .write = write_file_rx_chainmask, |
| 175 | .open = ath9k_debugfs_open, | 170 | .open = simple_open, |
| 176 | .owner = THIS_MODULE, | 171 | .owner = THIS_MODULE, |
| 177 | .llseek = default_llseek, | 172 | .llseek = default_llseek, |
| 178 | }; | 173 | }; |
| @@ -223,7 +218,7 @@ static ssize_t write_file_disable_ani(struct file *file, | |||
| 223 | static const struct file_operations fops_disable_ani = { | 218 | static const struct file_operations fops_disable_ani = { |
| 224 | .read = read_file_disable_ani, | 219 | .read = read_file_disable_ani, |
| 225 | .write = write_file_disable_ani, | 220 | .write = write_file_disable_ani, |
| 226 | .open = ath9k_debugfs_open, | 221 | .open = simple_open, |
| 227 | .owner = THIS_MODULE, | 222 | .owner = THIS_MODULE, |
| 228 | .llseek = default_llseek, | 223 | .llseek = default_llseek, |
| 229 | }; | 224 | }; |
| @@ -324,7 +319,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, | |||
| 324 | 319 | ||
| 325 | static const struct file_operations fops_dma = { | 320 | static const struct file_operations fops_dma = { |
| 326 | .read = read_file_dma, | 321 | .read = read_file_dma, |
| 327 | .open = ath9k_debugfs_open, | 322 | .open = simple_open, |
| 328 | .owner = THIS_MODULE, | 323 | .owner = THIS_MODULE, |
| 329 | .llseek = default_llseek, | 324 | .llseek = default_llseek, |
| 330 | }; | 325 | }; |
| @@ -446,7 +441,7 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, | |||
| 446 | 441 | ||
| 447 | static const struct file_operations fops_interrupt = { | 442 | static const struct file_operations fops_interrupt = { |
| 448 | .read = read_file_interrupt, | 443 | .read = read_file_interrupt, |
| 449 | .open = ath9k_debugfs_open, | 444 | .open = simple_open, |
| 450 | .owner = THIS_MODULE, | 445 | .owner = THIS_MODULE, |
| 451 | .llseek = default_llseek, | 446 | .llseek = default_llseek, |
| 452 | }; | 447 | }; |
| @@ -852,28 +847,28 @@ void ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, | |||
| 852 | 847 | ||
| 853 | static const struct file_operations fops_xmit = { | 848 | static const struct file_operations fops_xmit = { |
| 854 | .read = read_file_xmit, | 849 | .read = read_file_xmit, |
| 855 | .open = ath9k_debugfs_open, | 850 | .open = simple_open, |
| 856 | .owner = THIS_MODULE, | 851 | .owner = THIS_MODULE, |
| 857 | .llseek = default_llseek, | 852 | .llseek = default_llseek, |
| 858 | }; | 853 | }; |
| 859 | 854 | ||
| 860 | static const struct file_operations fops_stations = { | 855 | static const struct file_operations fops_stations = { |
| 861 | .read = read_file_stations, | 856 | .read = read_file_stations, |
| 862 | .open = ath9k_debugfs_open, | 857 | .open = simple_open, |
| 863 | .owner = THIS_MODULE, | 858 | .owner = THIS_MODULE, |
| 864 | .llseek = default_llseek, | 859 | .llseek = default_llseek, |
| 865 | }; | 860 | }; |
| 866 | 861 | ||
| 867 | static const struct file_operations fops_misc = { | 862 | static const struct file_operations fops_misc = { |
| 868 | .read = read_file_misc, | 863 | .read = read_file_misc, |
| 869 | .open = ath9k_debugfs_open, | 864 | .open = simple_open, |
| 870 | .owner = THIS_MODULE, | 865 | .owner = THIS_MODULE, |
| 871 | .llseek = default_llseek, | 866 | .llseek = default_llseek, |
| 872 | }; | 867 | }; |
| 873 | 868 | ||
| 874 | static const struct file_operations fops_reset = { | 869 | static const struct file_operations fops_reset = { |
| 875 | .read = read_file_reset, | 870 | .read = read_file_reset, |
| 876 | .open = ath9k_debugfs_open, | 871 | .open = simple_open, |
| 877 | .owner = THIS_MODULE, | 872 | .owner = THIS_MODULE, |
| 878 | .llseek = default_llseek, | 873 | .llseek = default_llseek, |
| 879 | }; | 874 | }; |
| @@ -1016,7 +1011,7 @@ void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) | |||
| 1016 | 1011 | ||
| 1017 | static const struct file_operations fops_recv = { | 1012 | static const struct file_operations fops_recv = { |
| 1018 | .read = read_file_recv, | 1013 | .read = read_file_recv, |
| 1019 | .open = ath9k_debugfs_open, | 1014 | .open = simple_open, |
| 1020 | .owner = THIS_MODULE, | 1015 | .owner = THIS_MODULE, |
| 1021 | .llseek = default_llseek, | 1016 | .llseek = default_llseek, |
| 1022 | }; | 1017 | }; |
| @@ -1055,7 +1050,7 @@ static ssize_t write_file_regidx(struct file *file, const char __user *user_buf, | |||
| 1055 | static const struct file_operations fops_regidx = { | 1050 | static const struct file_operations fops_regidx = { |
| 1056 | .read = read_file_regidx, | 1051 | .read = read_file_regidx, |
| 1057 | .write = write_file_regidx, | 1052 | .write = write_file_regidx, |
| 1058 | .open = ath9k_debugfs_open, | 1053 | .open = simple_open, |
| 1059 | .owner = THIS_MODULE, | 1054 | .owner = THIS_MODULE, |
| 1060 | .llseek = default_llseek, | 1055 | .llseek = default_llseek, |
| 1061 | }; | 1056 | }; |
| @@ -1102,7 +1097,7 @@ static ssize_t write_file_regval(struct file *file, const char __user *user_buf, | |||
| 1102 | static const struct file_operations fops_regval = { | 1097 | static const struct file_operations fops_regval = { |
| 1103 | .read = read_file_regval, | 1098 | .read = read_file_regval, |
| 1104 | .write = write_file_regval, | 1099 | .write = write_file_regval, |
| 1105 | .open = ath9k_debugfs_open, | 1100 | .open = simple_open, |
| 1106 | .owner = THIS_MODULE, | 1101 | .owner = THIS_MODULE, |
| 1107 | .llseek = default_llseek, | 1102 | .llseek = default_llseek, |
| 1108 | }; | 1103 | }; |
| @@ -1191,7 +1186,7 @@ static ssize_t read_file_dump_nfcal(struct file *file, char __user *user_buf, | |||
| 1191 | 1186 | ||
| 1192 | static const struct file_operations fops_dump_nfcal = { | 1187 | static const struct file_operations fops_dump_nfcal = { |
| 1193 | .read = read_file_dump_nfcal, | 1188 | .read = read_file_dump_nfcal, |
| 1194 | .open = ath9k_debugfs_open, | 1189 | .open = simple_open, |
| 1195 | .owner = THIS_MODULE, | 1190 | .owner = THIS_MODULE, |
| 1196 | .llseek = default_llseek, | 1191 | .llseek = default_llseek, |
| 1197 | }; | 1192 | }; |
| @@ -1219,7 +1214,7 @@ static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf, | |||
| 1219 | 1214 | ||
| 1220 | static const struct file_operations fops_base_eeprom = { | 1215 | static const struct file_operations fops_base_eeprom = { |
| 1221 | .read = read_file_base_eeprom, | 1216 | .read = read_file_base_eeprom, |
| 1222 | .open = ath9k_debugfs_open, | 1217 | .open = simple_open, |
| 1223 | .owner = THIS_MODULE, | 1218 | .owner = THIS_MODULE, |
| 1224 | .llseek = default_llseek, | 1219 | .llseek = default_llseek, |
| 1225 | }; | 1220 | }; |
| @@ -1247,7 +1242,7 @@ static ssize_t read_file_modal_eeprom(struct file *file, char __user *user_buf, | |||
| 1247 | 1242 | ||
| 1248 | static const struct file_operations fops_modal_eeprom = { | 1243 | static const struct file_operations fops_modal_eeprom = { |
| 1249 | .read = read_file_modal_eeprom, | 1244 | .read = read_file_modal_eeprom, |
| 1250 | .open = ath9k_debugfs_open, | 1245 | .open = simple_open, |
| 1251 | .owner = THIS_MODULE, | 1246 | .owner = THIS_MODULE, |
| 1252 | .llseek = default_llseek, | 1247 | .llseek = default_llseek, |
| 1253 | }; | 1248 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/dfs_debug.c b/drivers/net/wireless/ath/ath9k/dfs_debug.c index 106d031d834a..4364c103ed33 100644 --- a/drivers/net/wireless/ath/ath9k/dfs_debug.c +++ b/drivers/net/wireless/ath/ath9k/dfs_debug.c | |||
| @@ -60,16 +60,9 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, | |||
| 60 | return retval; | 60 | return retval; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | static int ath9k_dfs_debugfs_open(struct inode *inode, struct file *file) | ||
| 64 | { | ||
| 65 | file->private_data = inode->i_private; | ||
| 66 | |||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | static const struct file_operations fops_dfs_stats = { | 63 | static const struct file_operations fops_dfs_stats = { |
| 71 | .read = read_file_dfs, | 64 | .read = read_file_dfs, |
| 72 | .open = ath9k_dfs_debugfs_open, | 65 | .open = simple_open, |
| 73 | .owner = THIS_MODULE, | 66 | .owner = THIS_MODULE, |
| 74 | .llseek = default_llseek, | 67 | .llseek = default_llseek, |
| 75 | }; | 68 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c index d3ff33c71aa5..3035deb7a0cd 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c | |||
| @@ -16,12 +16,6 @@ | |||
| 16 | 16 | ||
| 17 | #include "htc.h" | 17 | #include "htc.h" |
| 18 | 18 | ||
| 19 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
| 20 | { | ||
| 21 | file->private_data = inode->i_private; | ||
| 22 | return 0; | ||
| 23 | } | ||
| 24 | |||
| 25 | static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, | 19 | static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, |
| 26 | size_t count, loff_t *ppos) | 20 | size_t count, loff_t *ppos) |
| 27 | { | 21 | { |
| @@ -75,7 +69,7 @@ static ssize_t read_file_tgt_int_stats(struct file *file, char __user *user_buf, | |||
| 75 | 69 | ||
| 76 | static const struct file_operations fops_tgt_int_stats = { | 70 | static const struct file_operations fops_tgt_int_stats = { |
| 77 | .read = read_file_tgt_int_stats, | 71 | .read = read_file_tgt_int_stats, |
| 78 | .open = ath9k_debugfs_open, | 72 | .open = simple_open, |
| 79 | .owner = THIS_MODULE, | 73 | .owner = THIS_MODULE, |
| 80 | .llseek = default_llseek, | 74 | .llseek = default_llseek, |
| 81 | }; | 75 | }; |
| @@ -145,7 +139,7 @@ static ssize_t read_file_tgt_tx_stats(struct file *file, char __user *user_buf, | |||
| 145 | 139 | ||
| 146 | static const struct file_operations fops_tgt_tx_stats = { | 140 | static const struct file_operations fops_tgt_tx_stats = { |
| 147 | .read = read_file_tgt_tx_stats, | 141 | .read = read_file_tgt_tx_stats, |
| 148 | .open = ath9k_debugfs_open, | 142 | .open = simple_open, |
| 149 | .owner = THIS_MODULE, | 143 | .owner = THIS_MODULE, |
| 150 | .llseek = default_llseek, | 144 | .llseek = default_llseek, |
| 151 | }; | 145 | }; |
| @@ -191,7 +185,7 @@ static ssize_t read_file_tgt_rx_stats(struct file *file, char __user *user_buf, | |||
| 191 | 185 | ||
| 192 | static const struct file_operations fops_tgt_rx_stats = { | 186 | static const struct file_operations fops_tgt_rx_stats = { |
| 193 | .read = read_file_tgt_rx_stats, | 187 | .read = read_file_tgt_rx_stats, |
| 194 | .open = ath9k_debugfs_open, | 188 | .open = simple_open, |
| 195 | .owner = THIS_MODULE, | 189 | .owner = THIS_MODULE, |
| 196 | .llseek = default_llseek, | 190 | .llseek = default_llseek, |
| 197 | }; | 191 | }; |
| @@ -243,7 +237,7 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf, | |||
| 243 | 237 | ||
| 244 | static const struct file_operations fops_xmit = { | 238 | static const struct file_operations fops_xmit = { |
| 245 | .read = read_file_xmit, | 239 | .read = read_file_xmit, |
| 246 | .open = ath9k_debugfs_open, | 240 | .open = simple_open, |
| 247 | .owner = THIS_MODULE, | 241 | .owner = THIS_MODULE, |
| 248 | .llseek = default_llseek, | 242 | .llseek = default_llseek, |
| 249 | }; | 243 | }; |
| @@ -364,7 +358,7 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf, | |||
| 364 | 358 | ||
| 365 | static const struct file_operations fops_recv = { | 359 | static const struct file_operations fops_recv = { |
| 366 | .read = read_file_recv, | 360 | .read = read_file_recv, |
| 367 | .open = ath9k_debugfs_open, | 361 | .open = simple_open, |
| 368 | .owner = THIS_MODULE, | 362 | .owner = THIS_MODULE, |
| 369 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
| 370 | }; | 364 | }; |
| @@ -399,7 +393,7 @@ static ssize_t read_file_slot(struct file *file, char __user *user_buf, | |||
| 399 | 393 | ||
| 400 | static const struct file_operations fops_slot = { | 394 | static const struct file_operations fops_slot = { |
| 401 | .read = read_file_slot, | 395 | .read = read_file_slot, |
| 402 | .open = ath9k_debugfs_open, | 396 | .open = simple_open, |
| 403 | .owner = THIS_MODULE, | 397 | .owner = THIS_MODULE, |
| 404 | .llseek = default_llseek, | 398 | .llseek = default_llseek, |
| 405 | }; | 399 | }; |
| @@ -446,7 +440,7 @@ static ssize_t read_file_queue(struct file *file, char __user *user_buf, | |||
| 446 | 440 | ||
| 447 | static const struct file_operations fops_queue = { | 441 | static const struct file_operations fops_queue = { |
| 448 | .read = read_file_queue, | 442 | .read = read_file_queue, |
| 449 | .open = ath9k_debugfs_open, | 443 | .open = simple_open, |
| 450 | .owner = THIS_MODULE, | 444 | .owner = THIS_MODULE, |
| 451 | .llseek = default_llseek, | 445 | .llseek = default_llseek, |
| 452 | }; | 446 | }; |
| @@ -487,7 +481,7 @@ static ssize_t write_file_debug(struct file *file, const char __user *user_buf, | |||
| 487 | static const struct file_operations fops_debug = { | 481 | static const struct file_operations fops_debug = { |
| 488 | .read = read_file_debug, | 482 | .read = read_file_debug, |
| 489 | .write = write_file_debug, | 483 | .write = write_file_debug, |
| 490 | .open = ath9k_debugfs_open, | 484 | .open = simple_open, |
| 491 | .owner = THIS_MODULE, | 485 | .owner = THIS_MODULE, |
| 492 | .llseek = default_llseek, | 486 | .llseek = default_llseek, |
| 493 | }; | 487 | }; |
| @@ -636,7 +630,7 @@ static ssize_t read_file_base_eeprom(struct file *file, char __user *user_buf, | |||
| 636 | 630 | ||
| 637 | static const struct file_operations fops_base_eeprom = { | 631 | static const struct file_operations fops_base_eeprom = { |
| 638 | .read = read_file_base_eeprom, | 632 | .read = read_file_base_eeprom, |
| 639 | .open = ath9k_debugfs_open, | 633 | .open = simple_open, |
| 640 | .owner = THIS_MODULE, | 634 | .owner = THIS_MODULE, |
| 641 | .llseek = default_llseek, | 635 | .llseek = default_llseek, |
| 642 | }; | 636 | }; |
| @@ -917,7 +911,7 @@ static ssize_t read_file_modal_eeprom(struct file *file, char __user *user_buf, | |||
| 917 | 911 | ||
| 918 | static const struct file_operations fops_modal_eeprom = { | 912 | static const struct file_operations fops_modal_eeprom = { |
| 919 | .read = read_file_modal_eeprom, | 913 | .read = read_file_modal_eeprom, |
| 920 | .open = ath9k_debugfs_open, | 914 | .open = simple_open, |
| 921 | .owner = THIS_MODULE, | 915 | .owner = THIS_MODULE, |
| 922 | .llseek = default_llseek, | 916 | .llseek = default_llseek, |
| 923 | }; | 917 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 4f848493fece..08bb45532701 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
| @@ -1480,12 +1480,6 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, | |||
| 1480 | 1480 | ||
| 1481 | #ifdef CONFIG_ATH9K_DEBUGFS | 1481 | #ifdef CONFIG_ATH9K_DEBUGFS |
| 1482 | 1482 | ||
| 1483 | static int ath9k_debugfs_open(struct inode *inode, struct file *file) | ||
| 1484 | { | ||
| 1485 | file->private_data = inode->i_private; | ||
| 1486 | return 0; | ||
| 1487 | } | ||
| 1488 | |||
| 1489 | static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, | 1483 | static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, |
| 1490 | size_t count, loff_t *ppos) | 1484 | size_t count, loff_t *ppos) |
| 1491 | { | 1485 | { |
| @@ -1553,7 +1547,7 @@ static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, | |||
| 1553 | 1547 | ||
| 1554 | static const struct file_operations fops_rcstat = { | 1548 | static const struct file_operations fops_rcstat = { |
| 1555 | .read = read_file_rcstat, | 1549 | .read = read_file_rcstat, |
| 1556 | .open = ath9k_debugfs_open, | 1550 | .open = simple_open, |
| 1557 | .owner = THIS_MODULE | 1551 | .owner = THIS_MODULE |
| 1558 | }; | 1552 | }; |
| 1559 | 1553 | ||
diff --git a/drivers/net/wireless/ath/carl9170/debug.c b/drivers/net/wireless/ath/carl9170/debug.c index 3c164226687f..93fe6003a493 100644 --- a/drivers/net/wireless/ath/carl9170/debug.c +++ b/drivers/net/wireless/ath/carl9170/debug.c | |||
| @@ -48,11 +48,6 @@ | |||
| 48 | #define ADD(buf, off, max, fmt, args...) \ | 48 | #define ADD(buf, off, max, fmt, args...) \ |
| 49 | off += snprintf(&buf[off], max - off, fmt, ##args); | 49 | off += snprintf(&buf[off], max - off, fmt, ##args); |
| 50 | 50 | ||
| 51 | static int carl9170_debugfs_open(struct inode *inode, struct file *file) | ||
| 52 | { | ||
| 53 | file->private_data = inode->i_private; | ||
| 54 | return 0; | ||
| 55 | } | ||
| 56 | 51 | ||
| 57 | struct carl9170_debugfs_fops { | 52 | struct carl9170_debugfs_fops { |
| 58 | unsigned int read_bufsize; | 53 | unsigned int read_bufsize; |
| @@ -178,7 +173,7 @@ static const struct carl9170_debugfs_fops carl_debugfs_##name ##_ops = {\ | |||
| 178 | .attr = _attr, \ | 173 | .attr = _attr, \ |
| 179 | .req_dev_state = _dstate, \ | 174 | .req_dev_state = _dstate, \ |
| 180 | .fops = { \ | 175 | .fops = { \ |
| 181 | .open = carl9170_debugfs_open, \ | 176 | .open = simple_open, \ |
| 182 | .read = carl9170_debugfs_read, \ | 177 | .read = carl9170_debugfs_read, \ |
| 183 | .write = carl9170_debugfs_write, \ | 178 | .write = carl9170_debugfs_write, \ |
| 184 | .owner = THIS_MODULE \ | 179 | .owner = THIS_MODULE \ |
diff --git a/drivers/net/wireless/b43/debugfs.c b/drivers/net/wireless/b43/debugfs.c index e751fdee89b2..e807bd930647 100644 --- a/drivers/net/wireless/b43/debugfs.c +++ b/drivers/net/wireless/b43/debugfs.c | |||
| @@ -500,12 +500,6 @@ out: | |||
| 500 | 500 | ||
| 501 | #undef fappend | 501 | #undef fappend |
| 502 | 502 | ||
| 503 | static int b43_debugfs_open(struct inode *inode, struct file *file) | ||
| 504 | { | ||
| 505 | file->private_data = inode->i_private; | ||
| 506 | return 0; | ||
| 507 | } | ||
| 508 | |||
| 509 | static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf, | 503 | static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf, |
| 510 | size_t count, loff_t *ppos) | 504 | size_t count, loff_t *ppos) |
| 511 | { | 505 | { |
| @@ -624,7 +618,7 @@ out_unlock: | |||
| 624 | .read = _read, \ | 618 | .read = _read, \ |
| 625 | .write = _write, \ | 619 | .write = _write, \ |
| 626 | .fops = { \ | 620 | .fops = { \ |
| 627 | .open = b43_debugfs_open, \ | 621 | .open = simple_open, \ |
| 628 | .read = b43_debugfs_read, \ | 622 | .read = b43_debugfs_read, \ |
| 629 | .write = b43_debugfs_write, \ | 623 | .write = b43_debugfs_write, \ |
| 630 | .llseek = generic_file_llseek, \ | 624 | .llseek = generic_file_llseek, \ |
diff --git a/drivers/net/wireless/b43legacy/debugfs.c b/drivers/net/wireless/b43legacy/debugfs.c index 5e28ad0d6d17..1965edb765a2 100644 --- a/drivers/net/wireless/b43legacy/debugfs.c +++ b/drivers/net/wireless/b43legacy/debugfs.c | |||
| @@ -197,12 +197,6 @@ static int restart_write_file(struct b43legacy_wldev *dev, const char *buf, size | |||
| 197 | 197 | ||
| 198 | #undef fappend | 198 | #undef fappend |
| 199 | 199 | ||
| 200 | static int b43legacy_debugfs_open(struct inode *inode, struct file *file) | ||
| 201 | { | ||
| 202 | file->private_data = inode->i_private; | ||
| 203 | return 0; | ||
| 204 | } | ||
| 205 | |||
| 206 | static ssize_t b43legacy_debugfs_read(struct file *file, char __user *userbuf, | 200 | static ssize_t b43legacy_debugfs_read(struct file *file, char __user *userbuf, |
| 207 | size_t count, loff_t *ppos) | 201 | size_t count, loff_t *ppos) |
| 208 | { | 202 | { |
| @@ -331,7 +325,7 @@ out_unlock: | |||
| 331 | .read = _read, \ | 325 | .read = _read, \ |
| 332 | .write = _write, \ | 326 | .write = _write, \ |
| 333 | .fops = { \ | 327 | .fops = { \ |
| 334 | .open = b43legacy_debugfs_open, \ | 328 | .open = simple_open, \ |
| 335 | .read = b43legacy_debugfs_read, \ | 329 | .read = b43legacy_debugfs_read, \ |
| 336 | .write = b43legacy_debugfs_write, \ | 330 | .write = b43legacy_debugfs_write, \ |
| 337 | .llseek = generic_file_llseek, \ | 331 | .llseek = generic_file_llseek, \ |
diff --git a/drivers/net/wireless/iwlegacy/3945-rs.c b/drivers/net/wireless/iwlegacy/3945-rs.c index 70bee1a4d876..4b10157d8686 100644 --- a/drivers/net/wireless/iwlegacy/3945-rs.c +++ b/drivers/net/wireless/iwlegacy/3945-rs.c | |||
| @@ -821,12 +821,6 @@ out: | |||
| 821 | } | 821 | } |
| 822 | 822 | ||
| 823 | #ifdef CONFIG_MAC80211_DEBUGFS | 823 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 824 | static int | ||
| 825 | il3945_open_file_generic(struct inode *inode, struct file *file) | ||
| 826 | { | ||
| 827 | file->private_data = inode->i_private; | ||
| 828 | return 0; | ||
| 829 | } | ||
| 830 | 824 | ||
| 831 | static ssize_t | 825 | static ssize_t |
| 832 | il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | 826 | il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, |
| @@ -862,7 +856,7 @@ il3945_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | |||
| 862 | 856 | ||
| 863 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 857 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
| 864 | .read = il3945_sta_dbgfs_stats_table_read, | 858 | .read = il3945_sta_dbgfs_stats_table_read, |
| 865 | .open = il3945_open_file_generic, | 859 | .open = simple_open, |
| 866 | .llseek = default_llseek, | 860 | .llseek = default_llseek, |
| 867 | }; | 861 | }; |
| 868 | 862 | ||
diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c index d7e2856e41d3..11ab1247fae1 100644 --- a/drivers/net/wireless/iwlegacy/4965-rs.c +++ b/drivers/net/wireless/iwlegacy/4965-rs.c | |||
| @@ -2518,12 +2518,6 @@ il4965_rs_free_sta(void *il_r, struct ieee80211_sta *sta, void *il_sta) | |||
| 2518 | } | 2518 | } |
| 2519 | 2519 | ||
| 2520 | #ifdef CONFIG_MAC80211_DEBUGFS | 2520 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 2521 | static int | ||
| 2522 | il4965_open_file_generic(struct inode *inode, struct file *file) | ||
| 2523 | { | ||
| 2524 | file->private_data = inode->i_private; | ||
| 2525 | return 0; | ||
| 2526 | } | ||
| 2527 | 2521 | ||
| 2528 | static void | 2522 | static void |
| 2529 | il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx) | 2523 | il4965_rs_dbgfs_set_mcs(struct il_lq_sta *lq_sta, u32 * rate_n_flags, int idx) |
| @@ -2695,7 +2689,7 @@ il4965_rs_sta_dbgfs_scale_table_read(struct file *file, char __user *user_buf, | |||
| 2695 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { | 2689 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { |
| 2696 | .write = il4965_rs_sta_dbgfs_scale_table_write, | 2690 | .write = il4965_rs_sta_dbgfs_scale_table_write, |
| 2697 | .read = il4965_rs_sta_dbgfs_scale_table_read, | 2691 | .read = il4965_rs_sta_dbgfs_scale_table_read, |
| 2698 | .open = il4965_open_file_generic, | 2692 | .open = simple_open, |
| 2699 | .llseek = default_llseek, | 2693 | .llseek = default_llseek, |
| 2700 | }; | 2694 | }; |
| 2701 | 2695 | ||
| @@ -2740,7 +2734,7 @@ il4965_rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, | |||
| 2740 | 2734 | ||
| 2741 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 2735 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
| 2742 | .read = il4965_rs_sta_dbgfs_stats_table_read, | 2736 | .read = il4965_rs_sta_dbgfs_stats_table_read, |
| 2743 | .open = il4965_open_file_generic, | 2737 | .open = simple_open, |
| 2744 | .llseek = default_llseek, | 2738 | .llseek = default_llseek, |
| 2745 | }; | 2739 | }; |
| 2746 | 2740 | ||
| @@ -2768,7 +2762,7 @@ il4965_rs_sta_dbgfs_rate_scale_data_read(struct file *file, | |||
| 2768 | 2762 | ||
| 2769 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { | 2763 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { |
| 2770 | .read = il4965_rs_sta_dbgfs_rate_scale_data_read, | 2764 | .read = il4965_rs_sta_dbgfs_rate_scale_data_read, |
| 2771 | .open = il4965_open_file_generic, | 2765 | .open = simple_open, |
| 2772 | .llseek = default_llseek, | 2766 | .llseek = default_llseek, |
| 2773 | }; | 2767 | }; |
| 2774 | 2768 | ||
diff --git a/drivers/net/wireless/iwlegacy/debug.c b/drivers/net/wireless/iwlegacy/debug.c index 229849150aac..eff26501d60a 100644 --- a/drivers/net/wireless/iwlegacy/debug.c +++ b/drivers/net/wireless/iwlegacy/debug.c | |||
| @@ -160,18 +160,12 @@ static ssize_t il_dbgfs_##name##_write(struct file *file, \ | |||
| 160 | const char __user *user_buf, \ | 160 | const char __user *user_buf, \ |
| 161 | size_t count, loff_t *ppos); | 161 | size_t count, loff_t *ppos); |
| 162 | 162 | ||
| 163 | static int | ||
| 164 | il_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
| 165 | { | ||
| 166 | file->private_data = inode->i_private; | ||
| 167 | return 0; | ||
| 168 | } | ||
| 169 | 163 | ||
| 170 | #define DEBUGFS_READ_FILE_OPS(name) \ | 164 | #define DEBUGFS_READ_FILE_OPS(name) \ |
| 171 | DEBUGFS_READ_FUNC(name); \ | 165 | DEBUGFS_READ_FUNC(name); \ |
| 172 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 166 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
| 173 | .read = il_dbgfs_##name##_read, \ | 167 | .read = il_dbgfs_##name##_read, \ |
| 174 | .open = il_dbgfs_open_file_generic, \ | 168 | .open = simple_open, \ |
| 175 | .llseek = generic_file_llseek, \ | 169 | .llseek = generic_file_llseek, \ |
| 176 | }; | 170 | }; |
| 177 | 171 | ||
| @@ -179,7 +173,7 @@ static const struct file_operations il_dbgfs_##name##_ops = { \ | |||
| 179 | DEBUGFS_WRITE_FUNC(name); \ | 173 | DEBUGFS_WRITE_FUNC(name); \ |
| 180 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 174 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
| 181 | .write = il_dbgfs_##name##_write, \ | 175 | .write = il_dbgfs_##name##_write, \ |
| 182 | .open = il_dbgfs_open_file_generic, \ | 176 | .open = simple_open, \ |
| 183 | .llseek = generic_file_llseek, \ | 177 | .llseek = generic_file_llseek, \ |
| 184 | }; | 178 | }; |
| 185 | 179 | ||
| @@ -189,7 +183,7 @@ static const struct file_operations il_dbgfs_##name##_ops = { \ | |||
| 189 | static const struct file_operations il_dbgfs_##name##_ops = { \ | 183 | static const struct file_operations il_dbgfs_##name##_ops = { \ |
| 190 | .write = il_dbgfs_##name##_write, \ | 184 | .write = il_dbgfs_##name##_write, \ |
| 191 | .read = il_dbgfs_##name##_read, \ | 185 | .read = il_dbgfs_##name##_read, \ |
| 192 | .open = il_dbgfs_open_file_generic, \ | 186 | .open = simple_open, \ |
| 193 | .llseek = generic_file_llseek, \ | 187 | .llseek = generic_file_llseek, \ |
| 194 | }; | 188 | }; |
| 195 | 189 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 53f8c51cfcdb..7e590b349dd7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
| @@ -3083,11 +3083,6 @@ static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, | |||
| 3083 | } | 3083 | } |
| 3084 | 3084 | ||
| 3085 | #ifdef CONFIG_MAC80211_DEBUGFS | 3085 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 3086 | static int open_file_generic(struct inode *inode, struct file *file) | ||
| 3087 | { | ||
| 3088 | file->private_data = inode->i_private; | ||
| 3089 | return 0; | ||
| 3090 | } | ||
| 3091 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, | 3086 | static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, |
| 3092 | u32 *rate_n_flags, int index) | 3087 | u32 *rate_n_flags, int index) |
| 3093 | { | 3088 | { |
| @@ -3226,7 +3221,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
| 3226 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { | 3221 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { |
| 3227 | .write = rs_sta_dbgfs_scale_table_write, | 3222 | .write = rs_sta_dbgfs_scale_table_write, |
| 3228 | .read = rs_sta_dbgfs_scale_table_read, | 3223 | .read = rs_sta_dbgfs_scale_table_read, |
| 3229 | .open = open_file_generic, | 3224 | .open = simple_open, |
| 3230 | .llseek = default_llseek, | 3225 | .llseek = default_llseek, |
| 3231 | }; | 3226 | }; |
| 3232 | static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, | 3227 | static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, |
| @@ -3269,7 +3264,7 @@ static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, | |||
| 3269 | 3264 | ||
| 3270 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { | 3265 | static const struct file_operations rs_sta_dbgfs_stats_table_ops = { |
| 3271 | .read = rs_sta_dbgfs_stats_table_read, | 3266 | .read = rs_sta_dbgfs_stats_table_read, |
| 3272 | .open = open_file_generic, | 3267 | .open = simple_open, |
| 3273 | .llseek = default_llseek, | 3268 | .llseek = default_llseek, |
| 3274 | }; | 3269 | }; |
| 3275 | 3270 | ||
| @@ -3295,7 +3290,7 @@ static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file, | |||
| 3295 | 3290 | ||
| 3296 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { | 3291 | static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { |
| 3297 | .read = rs_sta_dbgfs_rate_scale_data_read, | 3292 | .read = rs_sta_dbgfs_rate_scale_data_read, |
| 3298 | .open = open_file_generic, | 3293 | .open = simple_open, |
| 3299 | .llseek = default_llseek, | 3294 | .llseek = default_llseek, |
| 3300 | }; | 3295 | }; |
| 3301 | 3296 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index b7b1c04f2fba..2bbaebd99ad4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
| @@ -84,17 +84,11 @@ static ssize_t iwl_dbgfs_##name##_write(struct file *file, \ | |||
| 84 | size_t count, loff_t *ppos); | 84 | size_t count, loff_t *ppos); |
| 85 | 85 | ||
| 86 | 86 | ||
| 87 | static int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
| 88 | { | ||
| 89 | file->private_data = inode->i_private; | ||
| 90 | return 0; | ||
| 91 | } | ||
| 92 | |||
| 93 | #define DEBUGFS_READ_FILE_OPS(name) \ | 87 | #define DEBUGFS_READ_FILE_OPS(name) \ |
| 94 | DEBUGFS_READ_FUNC(name); \ | 88 | DEBUGFS_READ_FUNC(name); \ |
| 95 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 89 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 96 | .read = iwl_dbgfs_##name##_read, \ | 90 | .read = iwl_dbgfs_##name##_read, \ |
| 97 | .open = iwl_dbgfs_open_file_generic, \ | 91 | .open = simple_open, \ |
| 98 | .llseek = generic_file_llseek, \ | 92 | .llseek = generic_file_llseek, \ |
| 99 | }; | 93 | }; |
| 100 | 94 | ||
| @@ -102,7 +96,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
| 102 | DEBUGFS_WRITE_FUNC(name); \ | 96 | DEBUGFS_WRITE_FUNC(name); \ |
| 103 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 97 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 104 | .write = iwl_dbgfs_##name##_write, \ | 98 | .write = iwl_dbgfs_##name##_write, \ |
| 105 | .open = iwl_dbgfs_open_file_generic, \ | 99 | .open = simple_open, \ |
| 106 | .llseek = generic_file_llseek, \ | 100 | .llseek = generic_file_llseek, \ |
| 107 | }; | 101 | }; |
| 108 | 102 | ||
| @@ -113,7 +107,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
| 113 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 107 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 114 | .write = iwl_dbgfs_##name##_write, \ | 108 | .write = iwl_dbgfs_##name##_write, \ |
| 115 | .read = iwl_dbgfs_##name##_read, \ | 109 | .read = iwl_dbgfs_##name##_read, \ |
| 116 | .open = iwl_dbgfs_open_file_generic, \ | 110 | .open = simple_open, \ |
| 117 | .llseek = generic_file_llseek, \ | 111 | .llseek = generic_file_llseek, \ |
| 118 | }; | 112 | }; |
| 119 | 113 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index b4f796c82e1e..4d7b30d3e648 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | |||
| @@ -1898,17 +1898,11 @@ static ssize_t iwl_dbgfs_##name##_write(struct file *file, \ | |||
| 1898 | size_t count, loff_t *ppos); | 1898 | size_t count, loff_t *ppos); |
| 1899 | 1899 | ||
| 1900 | 1900 | ||
| 1901 | static int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) | ||
| 1902 | { | ||
| 1903 | file->private_data = inode->i_private; | ||
| 1904 | return 0; | ||
| 1905 | } | ||
| 1906 | |||
| 1907 | #define DEBUGFS_READ_FILE_OPS(name) \ | 1901 | #define DEBUGFS_READ_FILE_OPS(name) \ |
| 1908 | DEBUGFS_READ_FUNC(name); \ | 1902 | DEBUGFS_READ_FUNC(name); \ |
| 1909 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1903 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 1910 | .read = iwl_dbgfs_##name##_read, \ | 1904 | .read = iwl_dbgfs_##name##_read, \ |
| 1911 | .open = iwl_dbgfs_open_file_generic, \ | 1905 | .open = simple_open, \ |
| 1912 | .llseek = generic_file_llseek, \ | 1906 | .llseek = generic_file_llseek, \ |
| 1913 | }; | 1907 | }; |
| 1914 | 1908 | ||
| @@ -1916,7 +1910,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
| 1916 | DEBUGFS_WRITE_FUNC(name); \ | 1910 | DEBUGFS_WRITE_FUNC(name); \ |
| 1917 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1911 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 1918 | .write = iwl_dbgfs_##name##_write, \ | 1912 | .write = iwl_dbgfs_##name##_write, \ |
| 1919 | .open = iwl_dbgfs_open_file_generic, \ | 1913 | .open = simple_open, \ |
| 1920 | .llseek = generic_file_llseek, \ | 1914 | .llseek = generic_file_llseek, \ |
| 1921 | }; | 1915 | }; |
| 1922 | 1916 | ||
| @@ -1926,7 +1920,7 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
| 1926 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 1920 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
| 1927 | .write = iwl_dbgfs_##name##_write, \ | 1921 | .write = iwl_dbgfs_##name##_write, \ |
| 1928 | .read = iwl_dbgfs_##name##_read, \ | 1922 | .read = iwl_dbgfs_##name##_read, \ |
| 1929 | .open = iwl_dbgfs_open_file_generic, \ | 1923 | .open = simple_open, \ |
| 1930 | .llseek = generic_file_llseek, \ | 1924 | .llseek = generic_file_llseek, \ |
| 1931 | }; | 1925 | }; |
| 1932 | 1926 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/debugfs.c b/drivers/net/wireless/iwmc3200wifi/debugfs.c index 87eef5773a02..b6199d124bb9 100644 --- a/drivers/net/wireless/iwmc3200wifi/debugfs.c +++ b/drivers/net/wireless/iwmc3200wifi/debugfs.c | |||
| @@ -99,12 +99,6 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iwm_dbg_modules, | |||
| 99 | iwm_debugfs_u32_read, iwm_debugfs_dbg_modules_write, | 99 | iwm_debugfs_u32_read, iwm_debugfs_dbg_modules_write, |
| 100 | "%llu\n"); | 100 | "%llu\n"); |
| 101 | 101 | ||
| 102 | static int iwm_generic_open(struct inode *inode, struct file *filp) | ||
| 103 | { | ||
| 104 | filp->private_data = inode->i_private; | ||
| 105 | return 0; | ||
| 106 | } | ||
| 107 | |||
| 108 | 102 | ||
| 109 | static ssize_t iwm_debugfs_txq_read(struct file *filp, char __user *buffer, | 103 | static ssize_t iwm_debugfs_txq_read(struct file *filp, char __user *buffer, |
| 110 | size_t count, loff_t *ppos) | 104 | size_t count, loff_t *ppos) |
| @@ -401,28 +395,28 @@ out: | |||
| 401 | 395 | ||
| 402 | static const struct file_operations iwm_debugfs_txq_fops = { | 396 | static const struct file_operations iwm_debugfs_txq_fops = { |
| 403 | .owner = THIS_MODULE, | 397 | .owner = THIS_MODULE, |
| 404 | .open = iwm_generic_open, | 398 | .open = simple_open, |
| 405 | .read = iwm_debugfs_txq_read, | 399 | .read = iwm_debugfs_txq_read, |
| 406 | .llseek = default_llseek, | 400 | .llseek = default_llseek, |
| 407 | }; | 401 | }; |
| 408 | 402 | ||
| 409 | static const struct file_operations iwm_debugfs_tx_credit_fops = { | 403 | static const struct file_operations iwm_debugfs_tx_credit_fops = { |
| 410 | .owner = THIS_MODULE, | 404 | .owner = THIS_MODULE, |
| 411 | .open = iwm_generic_open, | 405 | .open = simple_open, |
| 412 | .read = iwm_debugfs_tx_credit_read, | 406 | .read = iwm_debugfs_tx_credit_read, |
| 413 | .llseek = default_llseek, | 407 | .llseek = default_llseek, |
| 414 | }; | 408 | }; |
| 415 | 409 | ||
| 416 | static const struct file_operations iwm_debugfs_rx_ticket_fops = { | 410 | static const struct file_operations iwm_debugfs_rx_ticket_fops = { |
| 417 | .owner = THIS_MODULE, | 411 | .owner = THIS_MODULE, |
| 418 | .open = iwm_generic_open, | 412 | .open = simple_open, |
| 419 | .read = iwm_debugfs_rx_ticket_read, | 413 | .read = iwm_debugfs_rx_ticket_read, |
| 420 | .llseek = default_llseek, | 414 | .llseek = default_llseek, |
| 421 | }; | 415 | }; |
| 422 | 416 | ||
| 423 | static const struct file_operations iwm_debugfs_fw_err_fops = { | 417 | static const struct file_operations iwm_debugfs_fw_err_fops = { |
| 424 | .owner = THIS_MODULE, | 418 | .owner = THIS_MODULE, |
| 425 | .open = iwm_generic_open, | 419 | .open = simple_open, |
| 426 | .read = iwm_debugfs_fw_err_read, | 420 | .read = iwm_debugfs_fw_err_read, |
| 427 | .llseek = default_llseek, | 421 | .llseek = default_llseek, |
| 428 | }; | 422 | }; |
diff --git a/drivers/net/wireless/iwmc3200wifi/sdio.c b/drivers/net/wireless/iwmc3200wifi/sdio.c index 764b40dd24ad..0042f204b07f 100644 --- a/drivers/net/wireless/iwmc3200wifi/sdio.c +++ b/drivers/net/wireless/iwmc3200wifi/sdio.c | |||
| @@ -264,13 +264,6 @@ static int if_sdio_send_chunk(struct iwm_priv *iwm, u8 *buf, int count) | |||
| 264 | return ret; | 264 | return ret; |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | /* debugfs hooks */ | ||
| 268 | static int iwm_debugfs_sdio_open(struct inode *inode, struct file *filp) | ||
| 269 | { | ||
| 270 | filp->private_data = inode->i_private; | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | static ssize_t iwm_debugfs_sdio_read(struct file *filp, char __user *buffer, | 267 | static ssize_t iwm_debugfs_sdio_read(struct file *filp, char __user *buffer, |
| 275 | size_t count, loff_t *ppos) | 268 | size_t count, loff_t *ppos) |
| 276 | { | 269 | { |
| @@ -363,7 +356,7 @@ err: | |||
| 363 | 356 | ||
| 364 | static const struct file_operations iwm_debugfs_sdio_fops = { | 357 | static const struct file_operations iwm_debugfs_sdio_fops = { |
| 365 | .owner = THIS_MODULE, | 358 | .owner = THIS_MODULE, |
| 366 | .open = iwm_debugfs_sdio_open, | 359 | .open = simple_open, |
| 367 | .read = iwm_debugfs_sdio_read, | 360 | .read = iwm_debugfs_sdio_read, |
| 368 | .llseek = default_llseek, | 361 | .llseek = default_llseek, |
| 369 | }; | 362 | }; |
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index c192671610fc..a06cc283e23d 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c | |||
| @@ -21,12 +21,6 @@ static char *szStates[] = { | |||
| 21 | static void lbs_debug_init(struct lbs_private *priv); | 21 | static void lbs_debug_init(struct lbs_private *priv); |
| 22 | #endif | 22 | #endif |
| 23 | 23 | ||
| 24 | static int open_file_generic(struct inode *inode, struct file *file) | ||
| 25 | { | ||
| 26 | file->private_data = inode->i_private; | ||
| 27 | return 0; | ||
| 28 | } | ||
| 29 | |||
| 30 | static ssize_t write_file_dummy(struct file *file, const char __user *buf, | 24 | static ssize_t write_file_dummy(struct file *file, const char __user *buf, |
| 31 | size_t count, loff_t *ppos) | 25 | size_t count, loff_t *ppos) |
| 32 | { | 26 | { |
| @@ -696,7 +690,7 @@ out_unlock: | |||
| 696 | 690 | ||
| 697 | #define FOPS(fread, fwrite) { \ | 691 | #define FOPS(fread, fwrite) { \ |
| 698 | .owner = THIS_MODULE, \ | 692 | .owner = THIS_MODULE, \ |
| 699 | .open = open_file_generic, \ | 693 | .open = simple_open, \ |
| 700 | .read = (fread), \ | 694 | .read = (fread), \ |
| 701 | .write = (fwrite), \ | 695 | .write = (fwrite), \ |
| 702 | .llseek = generic_file_llseek, \ | 696 | .llseek = generic_file_llseek, \ |
| @@ -962,7 +956,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | |||
| 962 | 956 | ||
| 963 | static const struct file_operations lbs_debug_fops = { | 957 | static const struct file_operations lbs_debug_fops = { |
| 964 | .owner = THIS_MODULE, | 958 | .owner = THIS_MODULE, |
| 965 | .open = open_file_generic, | 959 | .open = simple_open, |
| 966 | .write = lbs_debugfs_write, | 960 | .write = lbs_debugfs_write, |
| 967 | .read = lbs_debugfs_read, | 961 | .read = lbs_debugfs_read, |
| 968 | .llseek = default_llseek, | 962 | .llseek = default_llseek, |
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c index d26a78b6b3c4..1a845074c52a 100644 --- a/drivers/net/wireless/mwifiex/debugfs.c +++ b/drivers/net/wireless/mwifiex/debugfs.c | |||
| @@ -140,18 +140,6 @@ static struct mwifiex_debug_data items[] = { | |||
| 140 | static int num_of_items = ARRAY_SIZE(items); | 140 | static int num_of_items = ARRAY_SIZE(items); |
| 141 | 141 | ||
| 142 | /* | 142 | /* |
| 143 | * Generic proc file open handler. | ||
| 144 | * | ||
| 145 | * This function is called every time a file is accessed for read or write. | ||
| 146 | */ | ||
| 147 | static int | ||
| 148 | mwifiex_open_generic(struct inode *inode, struct file *file) | ||
| 149 | { | ||
| 150 | file->private_data = inode->i_private; | ||
| 151 | return 0; | ||
| 152 | } | ||
| 153 | |||
| 154 | /* | ||
| 155 | * Proc info file read handler. | 143 | * Proc info file read handler. |
| 156 | * | 144 | * |
| 157 | * This function is called when the 'info' file is opened for reading. | 145 | * This function is called when the 'info' file is opened for reading. |
| @@ -676,19 +664,19 @@ done: | |||
| 676 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 664 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
| 677 | .read = mwifiex_##name##_read, \ | 665 | .read = mwifiex_##name##_read, \ |
| 678 | .write = mwifiex_##name##_write, \ | 666 | .write = mwifiex_##name##_write, \ |
| 679 | .open = mwifiex_open_generic, \ | 667 | .open = simple_open, \ |
| 680 | }; | 668 | }; |
| 681 | 669 | ||
| 682 | #define MWIFIEX_DFS_FILE_READ_OPS(name) \ | 670 | #define MWIFIEX_DFS_FILE_READ_OPS(name) \ |
| 683 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 671 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
| 684 | .read = mwifiex_##name##_read, \ | 672 | .read = mwifiex_##name##_read, \ |
| 685 | .open = mwifiex_open_generic, \ | 673 | .open = simple_open, \ |
| 686 | }; | 674 | }; |
| 687 | 675 | ||
| 688 | #define MWIFIEX_DFS_FILE_WRITE_OPS(name) \ | 676 | #define MWIFIEX_DFS_FILE_WRITE_OPS(name) \ |
| 689 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ | 677 | static const struct file_operations mwifiex_dfs_##name##_fops = { \ |
| 690 | .write = mwifiex_##name##_write, \ | 678 | .write = mwifiex_##name##_write, \ |
| 691 | .open = mwifiex_open_generic, \ | 679 | .open = simple_open, \ |
| 692 | }; | 680 | }; |
| 693 | 681 | ||
| 694 | 682 | ||
diff --git a/drivers/net/wireless/wl1251/debugfs.c b/drivers/net/wireless/wl1251/debugfs.c index 6c274007d200..448da1f8c22f 100644 --- a/drivers/net/wireless/wl1251/debugfs.c +++ b/drivers/net/wireless/wl1251/debugfs.c | |||
| @@ -47,7 +47,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
| 47 | \ | 47 | \ |
| 48 | static const struct file_operations name## _ops = { \ | 48 | static const struct file_operations name## _ops = { \ |
| 49 | .read = name## _read, \ | 49 | .read = name## _read, \ |
| 50 | .open = wl1251_open_file_generic, \ | 50 | .open = simple_open, \ |
| 51 | .llseek = generic_file_llseek, \ | 51 | .llseek = generic_file_llseek, \ |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| @@ -84,7 +84,7 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ | |||
| 84 | \ | 84 | \ |
| 85 | static const struct file_operations sub## _ ##name## _ops = { \ | 85 | static const struct file_operations sub## _ ##name## _ops = { \ |
| 86 | .read = sub## _ ##name## _read, \ | 86 | .read = sub## _ ##name## _read, \ |
| 87 | .open = wl1251_open_file_generic, \ | 87 | .open = simple_open, \ |
| 88 | .llseek = generic_file_llseek, \ | 88 | .llseek = generic_file_llseek, \ |
| 89 | }; | 89 | }; |
| 90 | 90 | ||
| @@ -117,12 +117,6 @@ out: | |||
| 117 | mutex_unlock(&wl->mutex); | 117 | mutex_unlock(&wl->mutex); |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | static int wl1251_open_file_generic(struct inode *inode, struct file *file) | ||
| 121 | { | ||
| 122 | file->private_data = inode->i_private; | ||
| 123 | return 0; | ||
| 124 | } | ||
| 125 | |||
| 126 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, 20, "%u"); | 120 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, 20, "%u"); |
| 127 | 121 | ||
| 128 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, 20, "%u"); | 122 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, 20, "%u"); |
| @@ -235,7 +229,7 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, | |||
| 235 | 229 | ||
| 236 | static const struct file_operations tx_queue_len_ops = { | 230 | static const struct file_operations tx_queue_len_ops = { |
| 237 | .read = tx_queue_len_read, | 231 | .read = tx_queue_len_read, |
| 238 | .open = wl1251_open_file_generic, | 232 | .open = simple_open, |
| 239 | .llseek = generic_file_llseek, | 233 | .llseek = generic_file_llseek, |
| 240 | }; | 234 | }; |
| 241 | 235 | ||
| @@ -257,7 +251,7 @@ static ssize_t tx_queue_status_read(struct file *file, char __user *userbuf, | |||
| 257 | 251 | ||
| 258 | static const struct file_operations tx_queue_status_ops = { | 252 | static const struct file_operations tx_queue_status_ops = { |
| 259 | .read = tx_queue_status_read, | 253 | .read = tx_queue_status_read, |
| 260 | .open = wl1251_open_file_generic, | 254 | .open = simple_open, |
| 261 | .llseek = generic_file_llseek, | 255 | .llseek = generic_file_llseek, |
| 262 | }; | 256 | }; |
| 263 | 257 | ||
diff --git a/drivers/net/wireless/wl12xx/debugfs.c b/drivers/net/wireless/wl12xx/debugfs.c index e1cf72765965..564d49575c94 100644 --- a/drivers/net/wireless/wl12xx/debugfs.c +++ b/drivers/net/wireless/wl12xx/debugfs.c | |||
| @@ -63,7 +63,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
| 63 | \ | 63 | \ |
| 64 | static const struct file_operations name## _ops = { \ | 64 | static const struct file_operations name## _ops = { \ |
| 65 | .read = name## _read, \ | 65 | .read = name## _read, \ |
| 66 | .open = wl1271_open_file_generic, \ | 66 | .open = simple_open, \ |
| 67 | .llseek = generic_file_llseek, \ | 67 | .llseek = generic_file_llseek, \ |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| @@ -96,7 +96,7 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ | |||
| 96 | \ | 96 | \ |
| 97 | static const struct file_operations sub## _ ##name## _ops = { \ | 97 | static const struct file_operations sub## _ ##name## _ops = { \ |
| 98 | .read = sub## _ ##name## _read, \ | 98 | .read = sub## _ ##name## _read, \ |
| 99 | .open = wl1271_open_file_generic, \ | 99 | .open = simple_open, \ |
| 100 | .llseek = generic_file_llseek, \ | 100 | .llseek = generic_file_llseek, \ |
| 101 | }; | 101 | }; |
| 102 | 102 | ||
| @@ -126,12 +126,6 @@ out: | |||
| 126 | mutex_unlock(&wl->mutex); | 126 | mutex_unlock(&wl->mutex); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static int wl1271_open_file_generic(struct inode *inode, struct file *file) | ||
| 130 | { | ||
| 131 | file->private_data = inode->i_private; | ||
| 132 | return 0; | ||
| 133 | } | ||
| 134 | |||
| 135 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, "%u"); | 129 | DEBUGFS_FWSTATS_FILE(tx, internal_desc_overflow, "%u"); |
| 136 | 130 | ||
| 137 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, "%u"); | 131 | DEBUGFS_FWSTATS_FILE(rx, out_of_mem, "%u"); |
| @@ -243,7 +237,7 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, | |||
| 243 | 237 | ||
| 244 | static const struct file_operations tx_queue_len_ops = { | 238 | static const struct file_operations tx_queue_len_ops = { |
| 245 | .read = tx_queue_len_read, | 239 | .read = tx_queue_len_read, |
| 246 | .open = wl1271_open_file_generic, | 240 | .open = simple_open, |
| 247 | .llseek = default_llseek, | 241 | .llseek = default_llseek, |
| 248 | }; | 242 | }; |
| 249 | 243 | ||
| @@ -289,7 +283,7 @@ static ssize_t gpio_power_write(struct file *file, | |||
| 289 | static const struct file_operations gpio_power_ops = { | 283 | static const struct file_operations gpio_power_ops = { |
| 290 | .read = gpio_power_read, | 284 | .read = gpio_power_read, |
| 291 | .write = gpio_power_write, | 285 | .write = gpio_power_write, |
| 292 | .open = wl1271_open_file_generic, | 286 | .open = simple_open, |
| 293 | .llseek = default_llseek, | 287 | .llseek = default_llseek, |
| 294 | }; | 288 | }; |
| 295 | 289 | ||
| @@ -308,7 +302,7 @@ static ssize_t start_recovery_write(struct file *file, | |||
| 308 | 302 | ||
| 309 | static const struct file_operations start_recovery_ops = { | 303 | static const struct file_operations start_recovery_ops = { |
| 310 | .write = start_recovery_write, | 304 | .write = start_recovery_write, |
| 311 | .open = wl1271_open_file_generic, | 305 | .open = simple_open, |
| 312 | .llseek = default_llseek, | 306 | .llseek = default_llseek, |
| 313 | }; | 307 | }; |
| 314 | 308 | ||
| @@ -372,7 +366,7 @@ out: | |||
| 372 | static const struct file_operations dynamic_ps_timeout_ops = { | 366 | static const struct file_operations dynamic_ps_timeout_ops = { |
| 373 | .read = dynamic_ps_timeout_read, | 367 | .read = dynamic_ps_timeout_read, |
| 374 | .write = dynamic_ps_timeout_write, | 368 | .write = dynamic_ps_timeout_write, |
| 375 | .open = wl1271_open_file_generic, | 369 | .open = simple_open, |
| 376 | .llseek = default_llseek, | 370 | .llseek = default_llseek, |
| 377 | }; | 371 | }; |
| 378 | 372 | ||
| @@ -441,7 +435,7 @@ out: | |||
| 441 | static const struct file_operations forced_ps_ops = { | 435 | static const struct file_operations forced_ps_ops = { |
| 442 | .read = forced_ps_read, | 436 | .read = forced_ps_read, |
| 443 | .write = forced_ps_write, | 437 | .write = forced_ps_write, |
| 444 | .open = wl1271_open_file_generic, | 438 | .open = simple_open, |
| 445 | .llseek = default_llseek, | 439 | .llseek = default_llseek, |
| 446 | }; | 440 | }; |
| 447 | 441 | ||
| @@ -483,7 +477,7 @@ static ssize_t split_scan_timeout_write(struct file *file, | |||
| 483 | static const struct file_operations split_scan_timeout_ops = { | 477 | static const struct file_operations split_scan_timeout_ops = { |
| 484 | .read = split_scan_timeout_read, | 478 | .read = split_scan_timeout_read, |
| 485 | .write = split_scan_timeout_write, | 479 | .write = split_scan_timeout_write, |
| 486 | .open = wl1271_open_file_generic, | 480 | .open = simple_open, |
| 487 | .llseek = default_llseek, | 481 | .llseek = default_llseek, |
| 488 | }; | 482 | }; |
| 489 | 483 | ||
| @@ -566,7 +560,7 @@ static ssize_t driver_state_read(struct file *file, char __user *user_buf, | |||
| 566 | 560 | ||
| 567 | static const struct file_operations driver_state_ops = { | 561 | static const struct file_operations driver_state_ops = { |
| 568 | .read = driver_state_read, | 562 | .read = driver_state_read, |
| 569 | .open = wl1271_open_file_generic, | 563 | .open = simple_open, |
| 570 | .llseek = default_llseek, | 564 | .llseek = default_llseek, |
| 571 | }; | 565 | }; |
| 572 | 566 | ||
| @@ -675,7 +669,7 @@ static ssize_t vifs_state_read(struct file *file, char __user *user_buf, | |||
| 675 | 669 | ||
| 676 | static const struct file_operations vifs_state_ops = { | 670 | static const struct file_operations vifs_state_ops = { |
| 677 | .read = vifs_state_read, | 671 | .read = vifs_state_read, |
| 678 | .open = wl1271_open_file_generic, | 672 | .open = simple_open, |
| 679 | .llseek = default_llseek, | 673 | .llseek = default_llseek, |
| 680 | }; | 674 | }; |
| 681 | 675 | ||
| @@ -733,7 +727,7 @@ static ssize_t dtim_interval_write(struct file *file, | |||
| 733 | static const struct file_operations dtim_interval_ops = { | 727 | static const struct file_operations dtim_interval_ops = { |
| 734 | .read = dtim_interval_read, | 728 | .read = dtim_interval_read, |
| 735 | .write = dtim_interval_write, | 729 | .write = dtim_interval_write, |
| 736 | .open = wl1271_open_file_generic, | 730 | .open = simple_open, |
| 737 | .llseek = default_llseek, | 731 | .llseek = default_llseek, |
| 738 | }; | 732 | }; |
| 739 | 733 | ||
| @@ -791,7 +785,7 @@ static ssize_t suspend_dtim_interval_write(struct file *file, | |||
| 791 | static const struct file_operations suspend_dtim_interval_ops = { | 785 | static const struct file_operations suspend_dtim_interval_ops = { |
| 792 | .read = suspend_dtim_interval_read, | 786 | .read = suspend_dtim_interval_read, |
| 793 | .write = suspend_dtim_interval_write, | 787 | .write = suspend_dtim_interval_write, |
| 794 | .open = wl1271_open_file_generic, | 788 | .open = simple_open, |
| 795 | .llseek = default_llseek, | 789 | .llseek = default_llseek, |
| 796 | }; | 790 | }; |
| 797 | 791 | ||
| @@ -849,7 +843,7 @@ static ssize_t beacon_interval_write(struct file *file, | |||
| 849 | static const struct file_operations beacon_interval_ops = { | 843 | static const struct file_operations beacon_interval_ops = { |
| 850 | .read = beacon_interval_read, | 844 | .read = beacon_interval_read, |
| 851 | .write = beacon_interval_write, | 845 | .write = beacon_interval_write, |
| 852 | .open = wl1271_open_file_generic, | 846 | .open = simple_open, |
| 853 | .llseek = default_llseek, | 847 | .llseek = default_llseek, |
| 854 | }; | 848 | }; |
| 855 | 849 | ||
| @@ -904,7 +898,7 @@ static ssize_t rx_streaming_interval_read(struct file *file, | |||
| 904 | static const struct file_operations rx_streaming_interval_ops = { | 898 | static const struct file_operations rx_streaming_interval_ops = { |
| 905 | .read = rx_streaming_interval_read, | 899 | .read = rx_streaming_interval_read, |
| 906 | .write = rx_streaming_interval_write, | 900 | .write = rx_streaming_interval_write, |
| 907 | .open = wl1271_open_file_generic, | 901 | .open = simple_open, |
| 908 | .llseek = default_llseek, | 902 | .llseek = default_llseek, |
| 909 | }; | 903 | }; |
| 910 | 904 | ||
| @@ -959,7 +953,7 @@ static ssize_t rx_streaming_always_read(struct file *file, | |||
| 959 | static const struct file_operations rx_streaming_always_ops = { | 953 | static const struct file_operations rx_streaming_always_ops = { |
| 960 | .read = rx_streaming_always_read, | 954 | .read = rx_streaming_always_read, |
| 961 | .write = rx_streaming_always_write, | 955 | .write = rx_streaming_always_write, |
| 962 | .open = wl1271_open_file_generic, | 956 | .open = simple_open, |
| 963 | .llseek = default_llseek, | 957 | .llseek = default_llseek, |
| 964 | }; | 958 | }; |
| 965 | 959 | ||
| @@ -1003,7 +997,7 @@ out: | |||
| 1003 | 997 | ||
| 1004 | static const struct file_operations beacon_filtering_ops = { | 998 | static const struct file_operations beacon_filtering_ops = { |
| 1005 | .write = beacon_filtering_write, | 999 | .write = beacon_filtering_write, |
| 1006 | .open = wl1271_open_file_generic, | 1000 | .open = simple_open, |
| 1007 | .llseek = default_llseek, | 1001 | .llseek = default_llseek, |
| 1008 | }; | 1002 | }; |
| 1009 | 1003 | ||
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 663b32c2e931..0ebbb1906c30 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -1965,7 +1965,7 @@ static int __init netif_init(void) | |||
| 1965 | if (xen_initial_domain()) | 1965 | if (xen_initial_domain()) |
| 1966 | return 0; | 1966 | return 0; |
| 1967 | 1967 | ||
| 1968 | if (!xen_platform_pci_unplug) | 1968 | if (xen_hvm_domain() && !xen_platform_pci_unplug) |
| 1969 | return -ENODEV; | 1969 | return -ENODEV; |
| 1970 | 1970 | ||
| 1971 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); | 1971 | printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index ee8fd037bb53..849357c1045c 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
| @@ -117,25 +117,17 @@ static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_ | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | 119 | ||
| 120 | static int default_open(struct inode *inode, struct file *filp) | ||
| 121 | { | ||
| 122 | if (inode->i_private) | ||
| 123 | filp->private_data = inode->i_private; | ||
| 124 | return 0; | ||
| 125 | } | ||
| 126 | |||
| 127 | |||
| 128 | static const struct file_operations ulong_fops = { | 120 | static const struct file_operations ulong_fops = { |
| 129 | .read = ulong_read_file, | 121 | .read = ulong_read_file, |
| 130 | .write = ulong_write_file, | 122 | .write = ulong_write_file, |
| 131 | .open = default_open, | 123 | .open = simple_open, |
| 132 | .llseek = default_llseek, | 124 | .llseek = default_llseek, |
| 133 | }; | 125 | }; |
| 134 | 126 | ||
| 135 | 127 | ||
| 136 | static const struct file_operations ulong_ro_fops = { | 128 | static const struct file_operations ulong_ro_fops = { |
| 137 | .read = ulong_read_file, | 129 | .read = ulong_read_file, |
| 138 | .open = default_open, | 130 | .open = simple_open, |
| 139 | .llseek = default_llseek, | 131 | .llseek = default_llseek, |
| 140 | }; | 132 | }; |
| 141 | 133 | ||
| @@ -187,7 +179,7 @@ static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t coun | |||
| 187 | 179 | ||
| 188 | static const struct file_operations atomic_ro_fops = { | 180 | static const struct file_operations atomic_ro_fops = { |
| 189 | .read = atomic_read_file, | 181 | .read = atomic_read_file, |
| 190 | .open = default_open, | 182 | .open = simple_open, |
| 191 | .llseek = default_llseek, | 183 | .llseek = default_llseek, |
| 192 | }; | 184 | }; |
| 193 | 185 | ||
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index fd00ff02ab4d..d6cc62cb4cf7 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c | |||
| @@ -290,6 +290,7 @@ static int pci_frontend_enable_msix(struct pci_dev *dev, | |||
| 290 | } else { | 290 | } else { |
| 291 | printk(KERN_DEBUG "enable msix get value %x\n", | 291 | printk(KERN_DEBUG "enable msix get value %x\n", |
| 292 | op.value); | 292 | op.value); |
| 293 | err = op.value; | ||
| 293 | } | 294 | } |
| 294 | } else { | 295 | } else { |
| 295 | dev_err(&dev->dev, "enable msix get err %x\n", err); | 296 | dev_err(&dev->dev, "enable msix get err %x\n", err); |
diff --git a/drivers/remoteproc/remoteproc_debugfs.c b/drivers/remoteproc/remoteproc_debugfs.c index 70277a530133..85d31a69e117 100644 --- a/drivers/remoteproc/remoteproc_debugfs.c +++ b/drivers/remoteproc/remoteproc_debugfs.c | |||
| @@ -50,16 +50,9 @@ static ssize_t rproc_trace_read(struct file *filp, char __user *userbuf, | |||
| 50 | return simple_read_from_buffer(userbuf, count, ppos, trace->va, len); | 50 | return simple_read_from_buffer(userbuf, count, ppos, trace->va, len); |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | static int rproc_open_generic(struct inode *inode, struct file *file) | ||
| 54 | { | ||
| 55 | file->private_data = inode->i_private; | ||
| 56 | |||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | |||
| 60 | static const struct file_operations trace_rproc_ops = { | 53 | static const struct file_operations trace_rproc_ops = { |
| 61 | .read = rproc_trace_read, | 54 | .read = rproc_trace_read, |
| 62 | .open = rproc_open_generic, | 55 | .open = simple_open, |
| 63 | .llseek = generic_file_llseek, | 56 | .llseek = generic_file_llseek, |
| 64 | }; | 57 | }; |
| 65 | 58 | ||
| @@ -94,7 +87,7 @@ static ssize_t rproc_state_read(struct file *filp, char __user *userbuf, | |||
| 94 | 87 | ||
| 95 | static const struct file_operations rproc_state_ops = { | 88 | static const struct file_operations rproc_state_ops = { |
| 96 | .read = rproc_state_read, | 89 | .read = rproc_state_read, |
| 97 | .open = rproc_open_generic, | 90 | .open = simple_open, |
| 98 | .llseek = generic_file_llseek, | 91 | .llseek = generic_file_llseek, |
| 99 | }; | 92 | }; |
| 100 | 93 | ||
| @@ -114,7 +107,7 @@ static ssize_t rproc_name_read(struct file *filp, char __user *userbuf, | |||
| 114 | 107 | ||
| 115 | static const struct file_operations rproc_name_ops = { | 108 | static const struct file_operations rproc_name_ops = { |
| 116 | .read = rproc_name_read, | 109 | .read = rproc_name_read, |
| 117 | .open = rproc_open_generic, | 110 | .open = simple_open, |
| 118 | .llseek = generic_file_llseek, | 111 | .llseek = generic_file_llseek, |
| 119 | }; | 112 | }; |
| 120 | 113 | ||
diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index afee0e8ae714..feddefc42109 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c | |||
| @@ -72,9 +72,9 @@ static int pm860x_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 72 | struct pm860x_rtc_info *info = dev_get_drvdata(dev); | 72 | struct pm860x_rtc_info *info = dev_get_drvdata(dev); |
| 73 | 73 | ||
| 74 | if (enabled) | 74 | if (enabled) |
| 75 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM, ALARM); | 75 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM_EN, ALARM_EN); |
| 76 | else | 76 | else |
| 77 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM, 0); | 77 | pm860x_set_bits(info->i2c, PM8607_RTC1, ALARM_EN, 0); |
| 78 | return 0; | 78 | return 0; |
| 79 | } | 79 | } |
| 80 | 80 | ||
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 5bdf2eecb178..af04b0d6688d 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
| @@ -997,13 +997,6 @@ lpfc_debugfs_dumpDataDif_write(struct file *file, const char __user *buf, | |||
| 997 | return nbytes; | 997 | return nbytes; |
| 998 | } | 998 | } |
| 999 | 999 | ||
| 1000 | static int | ||
| 1001 | lpfc_debugfs_dif_err_open(struct inode *inode, struct file *file) | ||
| 1002 | { | ||
| 1003 | file->private_data = inode->i_private; | ||
| 1004 | return 0; | ||
| 1005 | } | ||
| 1006 | |||
| 1007 | static ssize_t | 1000 | static ssize_t |
| 1008 | lpfc_debugfs_dif_err_read(struct file *file, char __user *buf, | 1001 | lpfc_debugfs_dif_err_read(struct file *file, char __user *buf, |
| 1009 | size_t nbytes, loff_t *ppos) | 1002 | size_t nbytes, loff_t *ppos) |
| @@ -3541,7 +3534,7 @@ static const struct file_operations lpfc_debugfs_op_dumpDif = { | |||
| 3541 | #undef lpfc_debugfs_op_dif_err | 3534 | #undef lpfc_debugfs_op_dif_err |
| 3542 | static const struct file_operations lpfc_debugfs_op_dif_err = { | 3535 | static const struct file_operations lpfc_debugfs_op_dif_err = { |
| 3543 | .owner = THIS_MODULE, | 3536 | .owner = THIS_MODULE, |
| 3544 | .open = lpfc_debugfs_dif_err_open, | 3537 | .open = simple_open, |
| 3545 | .llseek = lpfc_debugfs_lseek, | 3538 | .llseek = lpfc_debugfs_lseek, |
| 3546 | .read = lpfc_debugfs_dif_err_read, | 3539 | .read = lpfc_debugfs_dif_err_read, |
| 3547 | .write = lpfc_debugfs_dif_err_write, | 3540 | .write = lpfc_debugfs_dif_err_write, |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 082458d73ce9..d1a495f64e2d 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
| @@ -63,12 +63,6 @@ struct chip_data { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | #ifdef CONFIG_DEBUG_FS | 65 | #ifdef CONFIG_DEBUG_FS |
| 66 | static int spi_show_regs_open(struct inode *inode, struct file *file) | ||
| 67 | { | ||
| 68 | file->private_data = inode->i_private; | ||
| 69 | return 0; | ||
| 70 | } | ||
| 71 | |||
| 72 | #define SPI_REGS_BUFSIZE 1024 | 66 | #define SPI_REGS_BUFSIZE 1024 |
| 73 | static ssize_t spi_show_regs(struct file *file, char __user *user_buf, | 67 | static ssize_t spi_show_regs(struct file *file, char __user *user_buf, |
| 74 | size_t count, loff_t *ppos) | 68 | size_t count, loff_t *ppos) |
| @@ -128,7 +122,7 @@ static ssize_t spi_show_regs(struct file *file, char __user *user_buf, | |||
| 128 | 122 | ||
| 129 | static const struct file_operations mrst_spi_regs_ops = { | 123 | static const struct file_operations mrst_spi_regs_ops = { |
| 130 | .owner = THIS_MODULE, | 124 | .owner = THIS_MODULE, |
| 131 | .open = spi_show_regs_open, | 125 | .open = simple_open, |
| 132 | .read = spi_show_regs, | 126 | .read = spi_show_regs, |
| 133 | .llseek = default_llseek, | 127 | .llseek = default_llseek, |
| 134 | }; | 128 | }; |
diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h index 830657908db8..c5eb3c33c3db 100644 --- a/drivers/target/tcm_fc/tcm_fc.h +++ b/drivers/target/tcm_fc/tcm_fc.h | |||
| @@ -122,6 +122,7 @@ struct ft_cmd { | |||
| 122 | /* Local sense buffer */ | 122 | /* Local sense buffer */ |
| 123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; | 123 | unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER]; |
| 124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ | 124 | u32 was_ddp_setup:1; /* Set only if ddp is setup */ |
| 125 | u32 aborted:1; /* Set if aborted by reset or timeout */ | ||
| 125 | struct scatterlist *sg; /* Set only if DDP is setup */ | 126 | struct scatterlist *sg; /* Set only if DDP is setup */ |
| 126 | u32 sg_cnt; /* No. of item in scatterlist */ | 127 | u32 sg_cnt; /* No. of item in scatterlist */ |
| 127 | }; | 128 | }; |
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 62dec9715ce5..a375f257aabc 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c | |||
| @@ -121,6 +121,8 @@ int ft_queue_status(struct se_cmd *se_cmd) | |||
| 121 | struct fc_exch *ep; | 121 | struct fc_exch *ep; |
| 122 | size_t len; | 122 | size_t len; |
| 123 | 123 | ||
| 124 | if (cmd->aborted) | ||
| 125 | return 0; | ||
| 124 | ft_dump_cmd(cmd, __func__); | 126 | ft_dump_cmd(cmd, __func__); |
| 125 | ep = fc_seq_exch(cmd->seq); | 127 | ep = fc_seq_exch(cmd->seq); |
| 126 | lport = ep->lp; | 128 | lport = ep->lp; |
| @@ -187,6 +189,8 @@ int ft_write_pending(struct se_cmd *se_cmd) | |||
| 187 | 189 | ||
| 188 | ft_dump_cmd(cmd, __func__); | 190 | ft_dump_cmd(cmd, __func__); |
| 189 | 191 | ||
| 192 | if (cmd->aborted) | ||
| 193 | return 0; | ||
| 190 | ep = fc_seq_exch(cmd->seq); | 194 | ep = fc_seq_exch(cmd->seq); |
| 191 | lport = ep->lp; | 195 | lport = ep->lp; |
| 192 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); | 196 | fp = fc_frame_alloc(lport, sizeof(*txrdy)); |
| @@ -252,10 +256,10 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg) | |||
| 252 | struct ft_cmd *cmd = arg; | 256 | struct ft_cmd *cmd = arg; |
| 253 | struct fc_frame_header *fh; | 257 | struct fc_frame_header *fh; |
| 254 | 258 | ||
| 255 | if (IS_ERR(fp)) { | 259 | if (unlikely(IS_ERR(fp))) { |
| 256 | /* XXX need to find cmd if queued */ | 260 | /* XXX need to find cmd if queued */ |
| 257 | cmd->seq = NULL; | 261 | cmd->seq = NULL; |
| 258 | transport_generic_free_cmd(&cmd->se_cmd, 0); | 262 | cmd->aborted = true; |
| 259 | return; | 263 | return; |
| 260 | } | 264 | } |
| 261 | 265 | ||
| @@ -399,6 +403,8 @@ int ft_queue_tm_resp(struct se_cmd *se_cmd) | |||
| 399 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; | 403 | struct se_tmr_req *tmr = se_cmd->se_tmr_req; |
| 400 | enum fcp_resp_rsp_codes code; | 404 | enum fcp_resp_rsp_codes code; |
| 401 | 405 | ||
| 406 | if (cmd->aborted) | ||
| 407 | return 0; | ||
| 402 | switch (tmr->response) { | 408 | switch (tmr->response) { |
| 403 | case TMR_FUNCTION_COMPLETE: | 409 | case TMR_FUNCTION_COMPLETE: |
| 404 | code = FCP_TMF_CMPL; | 410 | code = FCP_TMF_CMPL; |
diff --git a/drivers/target/tcm_fc/tfc_conf.c b/drivers/target/tcm_fc/tfc_conf.c index f357039349ba..2948dc944619 100644 --- a/drivers/target/tcm_fc/tfc_conf.c +++ b/drivers/target/tcm_fc/tfc_conf.c | |||
| @@ -300,6 +300,7 @@ static struct se_portal_group *ft_add_tpg( | |||
| 300 | { | 300 | { |
| 301 | struct ft_lport_acl *lacl; | 301 | struct ft_lport_acl *lacl; |
| 302 | struct ft_tpg *tpg; | 302 | struct ft_tpg *tpg; |
| 303 | struct workqueue_struct *wq; | ||
| 303 | unsigned long index; | 304 | unsigned long index; |
| 304 | int ret; | 305 | int ret; |
| 305 | 306 | ||
| @@ -321,18 +322,20 @@ static struct se_portal_group *ft_add_tpg( | |||
| 321 | tpg->lport_acl = lacl; | 322 | tpg->lport_acl = lacl; |
| 322 | INIT_LIST_HEAD(&tpg->lun_list); | 323 | INIT_LIST_HEAD(&tpg->lun_list); |
| 323 | 324 | ||
| 324 | ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, | 325 | wq = alloc_workqueue("tcm_fc", 0, 1); |
| 325 | tpg, TRANSPORT_TPG_TYPE_NORMAL); | 326 | if (!wq) { |
| 326 | if (ret < 0) { | ||
| 327 | kfree(tpg); | 327 | kfree(tpg); |
| 328 | return NULL; | 328 | return NULL; |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | tpg->workqueue = alloc_workqueue("tcm_fc", 0, 1); | 331 | ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, |
| 332 | if (!tpg->workqueue) { | 332 | tpg, TRANSPORT_TPG_TYPE_NORMAL); |
| 333 | if (ret < 0) { | ||
| 334 | destroy_workqueue(wq); | ||
| 333 | kfree(tpg); | 335 | kfree(tpg); |
| 334 | return NULL; | 336 | return NULL; |
| 335 | } | 337 | } |
| 338 | tpg->workqueue = wq; | ||
| 336 | 339 | ||
| 337 | mutex_lock(&ft_lport_lock); | 340 | mutex_lock(&ft_lport_lock); |
| 338 | list_add_tail(&tpg->list, &lacl->tpg_list); | 341 | list_add_tail(&tpg->list, &lacl->tpg_list); |
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 2b693eefac55..dc7c0db26e20 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c | |||
| @@ -81,6 +81,8 @@ int ft_queue_data_in(struct se_cmd *se_cmd) | |||
| 81 | void *from; | 81 | void *from; |
| 82 | void *to = NULL; | 82 | void *to = NULL; |
| 83 | 83 | ||
| 84 | if (cmd->aborted) | ||
| 85 | return 0; | ||
| 84 | ep = fc_seq_exch(cmd->seq); | 86 | ep = fc_seq_exch(cmd->seq); |
| 85 | lport = ep->lp; | 87 | lport = ep->lp; |
| 86 | cmd->seq = lport->tt.seq_start_next(cmd->seq); | 88 | cmd->seq = lport->tt.seq_start_next(cmd->seq); |
diff --git a/drivers/tty/serial/mfd.c b/drivers/tty/serial/mfd.c index a9234ba8f8d5..c4b50af46c44 100644 --- a/drivers/tty/serial/mfd.c +++ b/drivers/tty/serial/mfd.c | |||
| @@ -127,11 +127,6 @@ static inline void serial_out(struct uart_hsu_port *up, int offset, int value) | |||
| 127 | 127 | ||
| 128 | #define HSU_REGS_BUFSIZE 1024 | 128 | #define HSU_REGS_BUFSIZE 1024 |
| 129 | 129 | ||
| 130 | static int hsu_show_regs_open(struct inode *inode, struct file *file) | ||
| 131 | { | ||
| 132 | file->private_data = inode->i_private; | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | 130 | ||
| 136 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, | 131 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, |
| 137 | size_t count, loff_t *ppos) | 132 | size_t count, loff_t *ppos) |
| @@ -231,14 +226,14 @@ static ssize_t dma_show_regs(struct file *file, char __user *user_buf, | |||
| 231 | 226 | ||
| 232 | static const struct file_operations port_regs_ops = { | 227 | static const struct file_operations port_regs_ops = { |
| 233 | .owner = THIS_MODULE, | 228 | .owner = THIS_MODULE, |
| 234 | .open = hsu_show_regs_open, | 229 | .open = simple_open, |
| 235 | .read = port_show_regs, | 230 | .read = port_show_regs, |
| 236 | .llseek = default_llseek, | 231 | .llseek = default_llseek, |
| 237 | }; | 232 | }; |
| 238 | 233 | ||
| 239 | static const struct file_operations dma_regs_ops = { | 234 | static const struct file_operations dma_regs_ops = { |
| 240 | .owner = THIS_MODULE, | 235 | .owner = THIS_MODULE, |
| 241 | .open = hsu_show_regs_open, | 236 | .open = simple_open, |
| 242 | .read = dma_show_regs, | 237 | .read = dma_show_regs, |
| 243 | .llseek = default_llseek, | 238 | .llseek = default_llseek, |
| 244 | }; | 239 | }; |
diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c index e825460478be..08b9962b8fda 100644 --- a/drivers/tty/serial/pch_uart.c +++ b/drivers/tty/serial/pch_uart.c | |||
| @@ -304,11 +304,7 @@ static const int trigger_level_1[4] = { 1, 1, 1, 1 }; | |||
| 304 | #ifdef CONFIG_DEBUG_FS | 304 | #ifdef CONFIG_DEBUG_FS |
| 305 | 305 | ||
| 306 | #define PCH_REGS_BUFSIZE 1024 | 306 | #define PCH_REGS_BUFSIZE 1024 |
| 307 | static int pch_show_regs_open(struct inode *inode, struct file *file) | 307 | |
| 308 | { | ||
| 309 | file->private_data = inode->i_private; | ||
| 310 | return 0; | ||
| 311 | } | ||
| 312 | 308 | ||
| 313 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, | 309 | static ssize_t port_show_regs(struct file *file, char __user *user_buf, |
| 314 | size_t count, loff_t *ppos) | 310 | size_t count, loff_t *ppos) |
| @@ -362,7 +358,7 @@ static ssize_t port_show_regs(struct file *file, char __user *user_buf, | |||
| 362 | 358 | ||
| 363 | static const struct file_operations port_regs_ops = { | 359 | static const struct file_operations port_regs_ops = { |
| 364 | .owner = THIS_MODULE, | 360 | .owner = THIS_MODULE, |
| 365 | .open = pch_show_regs_open, | 361 | .open = simple_open, |
| 366 | .read = port_show_regs, | 362 | .read = port_show_regs, |
| 367 | .llseek = default_llseek, | 363 | .llseek = default_llseek, |
| 368 | }; | 364 | }; |
diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index 136e86faa1e1..05728894a88c 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c | |||
| @@ -327,7 +327,7 @@ static void send_sig_all(int sig) | |||
| 327 | if (is_global_init(p)) | 327 | if (is_global_init(p)) |
| 328 | continue; | 328 | continue; |
| 329 | 329 | ||
| 330 | force_sig(sig, p); | 330 | do_send_sig_info(sig, SEND_SIG_FORCED, p, true); |
| 331 | } | 331 | } |
| 332 | read_unlock(&tasklist_lock); | 332 | read_unlock(&tasklist_lock); |
| 333 | } | 333 | } |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index cefa0c8b5b6a..d2b9af59cba9 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
| @@ -428,18 +428,10 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig) | |||
| 428 | return retval; | 428 | return retval; |
| 429 | } | 429 | } |
| 430 | 430 | ||
| 431 | static int default_open (struct inode *inode, struct file *file) | ||
| 432 | { | ||
| 433 | if (inode->i_private) | ||
| 434 | file->private_data = inode->i_private; | ||
| 435 | |||
| 436 | return 0; | ||
| 437 | } | ||
| 438 | |||
| 439 | static const struct file_operations default_file_operations = { | 431 | static const struct file_operations default_file_operations = { |
| 440 | .read = default_read_file, | 432 | .read = default_read_file, |
| 441 | .write = default_write_file, | 433 | .write = default_write_file, |
| 442 | .open = default_open, | 434 | .open = simple_open, |
| 443 | .llseek = default_file_lseek, | 435 | .llseek = default_file_lseek, |
| 444 | }; | 436 | }; |
| 445 | 437 | ||
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 19f318ababa2..cf14c95a6700 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/of.h> | ||
| 16 | #include <linux/of_platform.h> | 17 | #include <linux/of_platform.h> |
| 17 | 18 | ||
| 18 | /* interface and function clocks */ | 19 | /* interface and function clocks */ |
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index fd9109d7eb0e..680e1a31fb87 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
| @@ -352,7 +352,6 @@ static int debug_async_open(struct inode *, struct file *); | |||
| 352 | static int debug_periodic_open(struct inode *, struct file *); | 352 | static int debug_periodic_open(struct inode *, struct file *); |
| 353 | static int debug_registers_open(struct inode *, struct file *); | 353 | static int debug_registers_open(struct inode *, struct file *); |
| 354 | static int debug_async_open(struct inode *, struct file *); | 354 | static int debug_async_open(struct inode *, struct file *); |
| 355 | static int debug_lpm_open(struct inode *, struct file *); | ||
| 356 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, | 355 | static ssize_t debug_lpm_read(struct file *file, char __user *user_buf, |
| 357 | size_t count, loff_t *ppos); | 356 | size_t count, loff_t *ppos); |
| 358 | static ssize_t debug_lpm_write(struct file *file, const char __user *buffer, | 357 | static ssize_t debug_lpm_write(struct file *file, const char __user *buffer, |
| @@ -385,7 +384,7 @@ static const struct file_operations debug_registers_fops = { | |||
| 385 | }; | 384 | }; |
| 386 | static const struct file_operations debug_lpm_fops = { | 385 | static const struct file_operations debug_lpm_fops = { |
| 387 | .owner = THIS_MODULE, | 386 | .owner = THIS_MODULE, |
| 388 | .open = debug_lpm_open, | 387 | .open = simple_open, |
| 389 | .read = debug_lpm_read, | 388 | .read = debug_lpm_read, |
| 390 | .write = debug_lpm_write, | 389 | .write = debug_lpm_write, |
| 391 | .release = debug_lpm_close, | 390 | .release = debug_lpm_close, |
| @@ -970,12 +969,6 @@ static int debug_registers_open(struct inode *inode, struct file *file) | |||
| 970 | return file->private_data ? 0 : -ENOMEM; | 969 | return file->private_data ? 0 : -ENOMEM; |
| 971 | } | 970 | } |
| 972 | 971 | ||
| 973 | static int debug_lpm_open(struct inode *inode, struct file *file) | ||
| 974 | { | ||
| 975 | file->private_data = inode->i_private; | ||
| 976 | return 0; | ||
| 977 | } | ||
| 978 | |||
| 979 | static int debug_lpm_close(struct inode *inode, struct file *file) | 972 | static int debug_lpm_close(struct inode *inode, struct file *file) |
| 980 | { | 973 | { |
| 981 | return 0; | 974 | return 0; |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index db8963f5fbce..09f597ad6e00 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #error "CONFIG_ARCH_AT91 must be defined." | 27 | #error "CONFIG_ARCH_AT91 must be defined." |
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | #define valid_port(index) ((index) >= 0 && (index) < AT91_MAX_USBH_PORTS) | ||
| 31 | #define at91_for_each_port(index) \ | ||
| 32 | for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++) | ||
| 33 | |||
| 30 | /* interface and function clocks; sometimes also an AHB clock */ | 34 | /* interface and function clocks; sometimes also an AHB clock */ |
| 31 | static struct clk *iclk, *fclk, *hclk; | 35 | static struct clk *iclk, *fclk, *hclk; |
| 32 | static int clocked; | 36 | static int clocked; |
| @@ -240,26 +244,26 @@ ohci_at91_start (struct usb_hcd *hcd) | |||
| 240 | 244 | ||
| 241 | static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int enable) | 245 | static void ohci_at91_usb_set_power(struct at91_usbh_data *pdata, int port, int enable) |
| 242 | { | 246 | { |
| 243 | if (port < 0 || port >= 2) | 247 | if (!valid_port(port)) |
| 244 | return; | 248 | return; |
| 245 | 249 | ||
| 246 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 250 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
| 247 | return; | 251 | return; |
| 248 | 252 | ||
| 249 | gpio_set_value(pdata->vbus_pin[port], | 253 | gpio_set_value(pdata->vbus_pin[port], |
| 250 | !pdata->vbus_pin_active_low[port] ^ enable); | 254 | pdata->vbus_pin_active_low[port] ^ enable); |
| 251 | } | 255 | } |
| 252 | 256 | ||
| 253 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) | 257 | static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port) |
| 254 | { | 258 | { |
| 255 | if (port < 0 || port >= 2) | 259 | if (!valid_port(port)) |
| 256 | return -EINVAL; | 260 | return -EINVAL; |
| 257 | 261 | ||
| 258 | if (!gpio_is_valid(pdata->vbus_pin[port])) | 262 | if (!gpio_is_valid(pdata->vbus_pin[port])) |
| 259 | return -EINVAL; | 263 | return -EINVAL; |
| 260 | 264 | ||
| 261 | return gpio_get_value(pdata->vbus_pin[port]) ^ | 265 | return gpio_get_value(pdata->vbus_pin[port]) ^ |
| 262 | !pdata->vbus_pin_active_low[port]; | 266 | pdata->vbus_pin_active_low[port]; |
| 263 | } | 267 | } |
| 264 | 268 | ||
| 265 | /* | 269 | /* |
| @@ -271,9 +275,9 @@ static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
| 271 | int length = ohci_hub_status_data(hcd, buf); | 275 | int length = ohci_hub_status_data(hcd, buf); |
| 272 | int port; | 276 | int port; |
| 273 | 277 | ||
| 274 | for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) { | 278 | at91_for_each_port(port) { |
| 275 | if (pdata->overcurrent_changed[port]) { | 279 | if (pdata->overcurrent_changed[port]) { |
| 276 | if (! length) | 280 | if (!length) |
| 277 | length = 1; | 281 | length = 1; |
| 278 | buf[0] |= 1 << (port + 1); | 282 | buf[0] |= 1 << (port + 1); |
| 279 | } | 283 | } |
| @@ -297,11 +301,17 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 297 | "ohci_at91_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n", | 301 | "ohci_at91_hub_control(%p,0x%04x,0x%04x,0x%04x,%p,%04x)\n", |
| 298 | hcd, typeReq, wValue, wIndex, buf, wLength); | 302 | hcd, typeReq, wValue, wIndex, buf, wLength); |
| 299 | 303 | ||
| 304 | wIndex--; | ||
| 305 | |||
| 300 | switch (typeReq) { | 306 | switch (typeReq) { |
| 301 | case SetPortFeature: | 307 | case SetPortFeature: |
| 302 | if (wValue == USB_PORT_FEAT_POWER) { | 308 | if (wValue == USB_PORT_FEAT_POWER) { |
| 303 | dev_dbg(hcd->self.controller, "SetPortFeat: POWER\n"); | 309 | dev_dbg(hcd->self.controller, "SetPortFeat: POWER\n"); |
| 304 | ohci_at91_usb_set_power(pdata, wIndex - 1, 1); | 310 | if (valid_port(wIndex)) { |
| 311 | ohci_at91_usb_set_power(pdata, wIndex, 1); | ||
| 312 | ret = 0; | ||
| 313 | } | ||
| 314 | |||
| 305 | goto out; | 315 | goto out; |
| 306 | } | 316 | } |
| 307 | break; | 317 | break; |
| @@ -312,9 +322,9 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 312 | dev_dbg(hcd->self.controller, | 322 | dev_dbg(hcd->self.controller, |
| 313 | "ClearPortFeature: C_OVER_CURRENT\n"); | 323 | "ClearPortFeature: C_OVER_CURRENT\n"); |
| 314 | 324 | ||
| 315 | if (wIndex == 1 || wIndex == 2) { | 325 | if (valid_port(wIndex)) { |
| 316 | pdata->overcurrent_changed[wIndex-1] = 0; | 326 | pdata->overcurrent_changed[wIndex] = 0; |
| 317 | pdata->overcurrent_status[wIndex-1] = 0; | 327 | pdata->overcurrent_status[wIndex] = 0; |
| 318 | } | 328 | } |
| 319 | 329 | ||
| 320 | goto out; | 330 | goto out; |
| @@ -323,9 +333,8 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 323 | dev_dbg(hcd->self.controller, | 333 | dev_dbg(hcd->self.controller, |
| 324 | "ClearPortFeature: OVER_CURRENT\n"); | 334 | "ClearPortFeature: OVER_CURRENT\n"); |
| 325 | 335 | ||
| 326 | if (wIndex == 1 || wIndex == 2) { | 336 | if (valid_port(wIndex)) |
| 327 | pdata->overcurrent_status[wIndex-1] = 0; | 337 | pdata->overcurrent_status[wIndex] = 0; |
| 328 | } | ||
| 329 | 338 | ||
| 330 | goto out; | 339 | goto out; |
| 331 | 340 | ||
| @@ -333,15 +342,15 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 333 | dev_dbg(hcd->self.controller, | 342 | dev_dbg(hcd->self.controller, |
| 334 | "ClearPortFeature: POWER\n"); | 343 | "ClearPortFeature: POWER\n"); |
| 335 | 344 | ||
| 336 | if (wIndex == 1 || wIndex == 2) { | 345 | if (valid_port(wIndex)) { |
| 337 | ohci_at91_usb_set_power(pdata, wIndex - 1, 0); | 346 | ohci_at91_usb_set_power(pdata, wIndex, 0); |
| 338 | return 0; | 347 | return 0; |
| 339 | } | 348 | } |
| 340 | } | 349 | } |
| 341 | break; | 350 | break; |
| 342 | } | 351 | } |
| 343 | 352 | ||
| 344 | ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); | 353 | ret = ohci_hub_control(hcd, typeReq, wValue, wIndex + 1, buf, wLength); |
| 345 | if (ret) | 354 | if (ret) |
| 346 | goto out; | 355 | goto out; |
| 347 | 356 | ||
| @@ -377,18 +386,15 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 377 | 386 | ||
| 378 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); | 387 | dev_dbg(hcd->self.controller, "GetPortStatus(%d)\n", wIndex); |
| 379 | 388 | ||
| 380 | if (wIndex == 1 || wIndex == 2) { | 389 | if (valid_port(wIndex)) { |
| 381 | if (! ohci_at91_usb_get_power(pdata, wIndex-1)) { | 390 | if (!ohci_at91_usb_get_power(pdata, wIndex)) |
| 382 | *data &= ~cpu_to_le32(RH_PS_PPS); | 391 | *data &= ~cpu_to_le32(RH_PS_PPS); |
| 383 | } | ||
| 384 | 392 | ||
| 385 | if (pdata->overcurrent_changed[wIndex-1]) { | 393 | if (pdata->overcurrent_changed[wIndex]) |
| 386 | *data |= cpu_to_le32(RH_PS_OCIC); | 394 | *data |= cpu_to_le32(RH_PS_OCIC); |
| 387 | } | ||
| 388 | 395 | ||
| 389 | if (pdata->overcurrent_status[wIndex-1]) { | 396 | if (pdata->overcurrent_status[wIndex]) |
| 390 | *data |= cpu_to_le32(RH_PS_POCI); | 397 | *data |= cpu_to_le32(RH_PS_POCI); |
| 391 | } | ||
| 392 | } | 398 | } |
| 393 | } | 399 | } |
| 394 | 400 | ||
| @@ -450,14 +456,14 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) | |||
| 450 | 456 | ||
| 451 | /* From the GPIO notifying the over-current situation, find | 457 | /* From the GPIO notifying the over-current situation, find |
| 452 | * out the corresponding port */ | 458 | * out the corresponding port */ |
| 453 | for (port = 0; port < ARRAY_SIZE(pdata->overcurrent_pin); port++) { | 459 | at91_for_each_port(port) { |
| 454 | if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { | 460 | if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { |
| 455 | gpio = pdata->overcurrent_pin[port]; | 461 | gpio = pdata->overcurrent_pin[port]; |
| 456 | break; | 462 | break; |
| 457 | } | 463 | } |
| 458 | } | 464 | } |
| 459 | 465 | ||
| 460 | if (port == ARRAY_SIZE(pdata->overcurrent_pin)) { | 466 | if (port == AT91_MAX_USBH_PORTS) { |
| 461 | dev_err(& pdev->dev, "overcurrent interrupt from unknown GPIO\n"); | 467 | dev_err(& pdev->dev, "overcurrent interrupt from unknown GPIO\n"); |
| 462 | return IRQ_HANDLED; | 468 | return IRQ_HANDLED; |
| 463 | } | 469 | } |
| @@ -467,7 +473,7 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) | |||
| 467 | /* When notified of an over-current situation, disable power | 473 | /* When notified of an over-current situation, disable power |
| 468 | on the corresponding port, and mark this port in | 474 | on the corresponding port, and mark this port in |
| 469 | over-current. */ | 475 | over-current. */ |
| 470 | if (! val) { | 476 | if (!val) { |
| 471 | ohci_at91_usb_set_power(pdata, port, 0); | 477 | ohci_at91_usb_set_power(pdata, port, 0); |
| 472 | pdata->overcurrent_status[port] = 1; | 478 | pdata->overcurrent_status[port] = 1; |
| 473 | pdata->overcurrent_changed[port] = 1; | 479 | pdata->overcurrent_changed[port] = 1; |
| @@ -492,7 +498,7 @@ static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32); | |||
| 492 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) | 498 | static int __devinit ohci_at91_of_init(struct platform_device *pdev) |
| 493 | { | 499 | { |
| 494 | struct device_node *np = pdev->dev.of_node; | 500 | struct device_node *np = pdev->dev.of_node; |
| 495 | int i, ret, gpio; | 501 | int i, gpio; |
| 496 | enum of_gpio_flags flags; | 502 | enum of_gpio_flags flags; |
| 497 | struct at91_usbh_data *pdata; | 503 | struct at91_usbh_data *pdata; |
| 498 | u32 ports; | 504 | u32 ports; |
| @@ -514,48 +520,17 @@ static int __devinit ohci_at91_of_init(struct platform_device *pdev) | |||
| 514 | if (!of_property_read_u32(np, "num-ports", &ports)) | 520 | if (!of_property_read_u32(np, "num-ports", &ports)) |
| 515 | pdata->ports = ports; | 521 | pdata->ports = ports; |
| 516 | 522 | ||
| 517 | for (i = 0; i < 2; i++) { | 523 | at91_for_each_port(i) { |
| 518 | gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags); | 524 | gpio = of_get_named_gpio_flags(np, "atmel,vbus-gpio", i, &flags); |
| 519 | pdata->vbus_pin[i] = gpio; | 525 | pdata->vbus_pin[i] = gpio; |
| 520 | if (!gpio_is_valid(gpio)) | 526 | if (!gpio_is_valid(gpio)) |
| 521 | continue; | 527 | continue; |
| 522 | pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW; | 528 | pdata->vbus_pin_active_low[i] = flags & OF_GPIO_ACTIVE_LOW; |
| 523 | ret = gpio_request(gpio, "ohci_vbus"); | ||
| 524 | if (ret) { | ||
| 525 | dev_warn(&pdev->dev, "can't request vbus gpio %d", gpio); | ||
| 526 | continue; | ||
| 527 | } | ||
| 528 | ret = gpio_direction_output(gpio, !(flags & OF_GPIO_ACTIVE_LOW) ^ 1); | ||
| 529 | if (ret) | ||
| 530 | dev_warn(&pdev->dev, "can't put vbus gpio %d as output %d", | ||
| 531 | !(flags & OF_GPIO_ACTIVE_LOW) ^ 1, gpio); | ||
| 532 | } | 529 | } |
| 533 | 530 | ||
| 534 | for (i = 0; i < 2; i++) { | 531 | at91_for_each_port(i) |
| 535 | gpio = of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); | 532 | pdata->overcurrent_pin[i] = |
| 536 | pdata->overcurrent_pin[i] = gpio; | 533 | of_get_named_gpio_flags(np, "atmel,oc-gpio", i, &flags); |
| 537 | if (!gpio_is_valid(gpio)) | ||
| 538 | continue; | ||
| 539 | ret = gpio_request(gpio, "ohci_overcurrent"); | ||
| 540 | if (ret) { | ||
| 541 | dev_err(&pdev->dev, "can't request overcurrent gpio %d", gpio); | ||
| 542 | continue; | ||
| 543 | } | ||
| 544 | |||
| 545 | ret = gpio_direction_input(gpio); | ||
| 546 | if (ret) { | ||
| 547 | dev_err(&pdev->dev, "can't configure overcurrent gpio %d as input", gpio); | ||
| 548 | continue; | ||
| 549 | } | ||
| 550 | |||
| 551 | ret = request_irq(gpio_to_irq(gpio), | ||
| 552 | ohci_hcd_at91_overcurrent_irq, | ||
| 553 | IRQF_SHARED, "ohci_overcurrent", pdev); | ||
| 554 | if (ret) { | ||
| 555 | gpio_free(gpio); | ||
| 556 | dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n"); | ||
| 557 | } | ||
| 558 | } | ||
| 559 | 534 | ||
| 560 | pdev->dev.platform_data = pdata; | 535 | pdev->dev.platform_data = pdata; |
| 561 | 536 | ||
| @@ -574,35 +549,69 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) | |||
| 574 | { | 549 | { |
| 575 | struct at91_usbh_data *pdata; | 550 | struct at91_usbh_data *pdata; |
| 576 | int i; | 551 | int i; |
| 552 | int gpio; | ||
| 553 | int ret; | ||
| 577 | 554 | ||
| 578 | i = ohci_at91_of_init(pdev); | 555 | ret = ohci_at91_of_init(pdev); |
| 579 | 556 | if (ret) | |
| 580 | if (i) | 557 | return ret; |
| 581 | return i; | ||
| 582 | 558 | ||
| 583 | pdata = pdev->dev.platform_data; | 559 | pdata = pdev->dev.platform_data; |
| 584 | 560 | ||
| 585 | if (pdata) { | 561 | if (pdata) { |
| 586 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { | 562 | at91_for_each_port(i) { |
| 587 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 563 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
| 588 | continue; | 564 | continue; |
| 589 | gpio_request(pdata->vbus_pin[i], "ohci_vbus"); | 565 | gpio = pdata->vbus_pin[i]; |
| 566 | |||
| 567 | ret = gpio_request(gpio, "ohci_vbus"); | ||
| 568 | if (ret) { | ||
| 569 | dev_err(&pdev->dev, | ||
| 570 | "can't request vbus gpio %d\n", gpio); | ||
| 571 | continue; | ||
| 572 | } | ||
| 573 | ret = gpio_direction_output(gpio, | ||
| 574 | !pdata->vbus_pin_active_low[i]); | ||
| 575 | if (ret) { | ||
| 576 | dev_err(&pdev->dev, | ||
| 577 | "can't put vbus gpio %d as output %d\n", | ||
| 578 | gpio, !pdata->vbus_pin_active_low[i]); | ||
| 579 | gpio_free(gpio); | ||
| 580 | continue; | ||
| 581 | } | ||
| 582 | |||
| 590 | ohci_at91_usb_set_power(pdata, i, 1); | 583 | ohci_at91_usb_set_power(pdata, i, 1); |
| 591 | } | 584 | } |
| 592 | 585 | ||
| 593 | for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) { | 586 | at91_for_each_port(i) { |
| 594 | int ret; | ||
| 595 | |||
| 596 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) | 587 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) |
| 597 | continue; | 588 | continue; |
| 598 | gpio_request(pdata->overcurrent_pin[i], "ohci_overcurrent"); | 589 | gpio = pdata->overcurrent_pin[i]; |
| 590 | |||
| 591 | ret = gpio_request(gpio, "ohci_overcurrent"); | ||
| 592 | if (ret) { | ||
| 593 | dev_err(&pdev->dev, | ||
| 594 | "can't request overcurrent gpio %d\n", | ||
| 595 | gpio); | ||
| 596 | continue; | ||
| 597 | } | ||
| 598 | |||
| 599 | ret = gpio_direction_input(gpio); | ||
| 600 | if (ret) { | ||
| 601 | dev_err(&pdev->dev, | ||
| 602 | "can't configure overcurrent gpio %d as input\n", | ||
| 603 | gpio); | ||
| 604 | gpio_free(gpio); | ||
| 605 | continue; | ||
| 606 | } | ||
| 599 | 607 | ||
| 600 | ret = request_irq(gpio_to_irq(pdata->overcurrent_pin[i]), | 608 | ret = request_irq(gpio_to_irq(gpio), |
| 601 | ohci_hcd_at91_overcurrent_irq, | 609 | ohci_hcd_at91_overcurrent_irq, |
| 602 | IRQF_SHARED, "ohci_overcurrent", pdev); | 610 | IRQF_SHARED, "ohci_overcurrent", pdev); |
| 603 | if (ret) { | 611 | if (ret) { |
| 604 | gpio_free(pdata->overcurrent_pin[i]); | 612 | gpio_free(gpio); |
| 605 | dev_warn(& pdev->dev, "cannot get GPIO IRQ for overcurrent\n"); | 613 | dev_err(&pdev->dev, |
| 614 | "can't get gpio IRQ for overcurrent\n"); | ||
| 606 | } | 615 | } |
| 607 | } | 616 | } |
| 608 | } | 617 | } |
| @@ -617,14 +626,14 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) | |||
| 617 | int i; | 626 | int i; |
| 618 | 627 | ||
| 619 | if (pdata) { | 628 | if (pdata) { |
| 620 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { | 629 | at91_for_each_port(i) { |
| 621 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 630 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
| 622 | continue; | 631 | continue; |
| 623 | ohci_at91_usb_set_power(pdata, i, 0); | 632 | ohci_at91_usb_set_power(pdata, i, 0); |
| 624 | gpio_free(pdata->vbus_pin[i]); | 633 | gpio_free(pdata->vbus_pin[i]); |
| 625 | } | 634 | } |
| 626 | 635 | ||
| 627 | for (i = 0; i < ARRAY_SIZE(pdata->overcurrent_pin); i++) { | 636 | at91_for_each_port(i) { |
| 628 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) | 637 | if (!gpio_is_valid(pdata->overcurrent_pin[i])) |
| 629 | continue; | 638 | continue; |
| 630 | free_irq(gpio_to_irq(pdata->overcurrent_pin[i]), pdev); | 639 | free_irq(gpio_to_irq(pdata->overcurrent_pin[i]), pdev); |
diff --git a/drivers/uwb/uwb-debug.c b/drivers/uwb/uwb-debug.c index 2eecec0c13c9..6ec45beb7af5 100644 --- a/drivers/uwb/uwb-debug.c +++ b/drivers/uwb/uwb-debug.c | |||
| @@ -159,13 +159,6 @@ static int cmd_ie_rm(struct uwb_rc *rc, struct uwb_dbg_cmd_ie *ie_to_rm) | |||
| 159 | return uwb_rc_ie_rm(rc, ie_to_rm->data[0]); | 159 | return uwb_rc_ie_rm(rc, ie_to_rm->data[0]); |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | static int command_open(struct inode *inode, struct file *file) | ||
| 163 | { | ||
| 164 | file->private_data = inode->i_private; | ||
| 165 | |||
| 166 | return 0; | ||
| 167 | } | ||
| 168 | |||
| 169 | static ssize_t command_write(struct file *file, const char __user *buf, | 162 | static ssize_t command_write(struct file *file, const char __user *buf, |
| 170 | size_t len, loff_t *off) | 163 | size_t len, loff_t *off) |
| 171 | { | 164 | { |
| @@ -206,7 +199,7 @@ static ssize_t command_write(struct file *file, const char __user *buf, | |||
| 206 | } | 199 | } |
| 207 | 200 | ||
| 208 | static const struct file_operations command_fops = { | 201 | static const struct file_operations command_fops = { |
| 209 | .open = command_open, | 202 | .open = simple_open, |
| 210 | .write = command_write, | 203 | .write = command_write, |
| 211 | .read = NULL, | 204 | .read = NULL, |
| 212 | .llseek = no_llseek, | 205 | .llseek = no_llseek, |
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 7ed9991fa747..af16884491ed 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig | |||
| @@ -245,6 +245,12 @@ config BACKLIGHT_DA903X | |||
| 245 | If you have a LCD backlight connected to the WLED output of DA9030 | 245 | If you have a LCD backlight connected to the WLED output of DA9030 |
| 246 | or DA9034 WLED output, say Y here to enable this driver. | 246 | or DA9034 WLED output, say Y here to enable this driver. |
| 247 | 247 | ||
| 248 | config BACKLIGHT_DA9052 | ||
| 249 | tristate "Dialog DA9052/DA9053 WLED" | ||
| 250 | depends on PMIC_DA9052 | ||
| 251 | help | ||
| 252 | Enable the Backlight Driver for DA9052-BC and DA9053-AA/Bx PMICs. | ||
| 253 | |||
| 248 | config BACKLIGHT_MAX8925 | 254 | config BACKLIGHT_MAX8925 |
| 249 | tristate "Backlight driver for MAX8925" | 255 | tristate "Backlight driver for MAX8925" |
| 250 | depends on MFD_MAX8925 | 256 | depends on MFD_MAX8925 |
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 8071eb656147..36855ae887d6 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile | |||
| @@ -29,6 +29,7 @@ obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o | |||
| 29 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o | 29 | obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o |
| 30 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o | 30 | obj-$(CONFIG_BACKLIGHT_PWM) += pwm_bl.o |
| 31 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o | 31 | obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o |
| 32 | obj-$(CONFIG_BACKLIGHT_DA9052) += da9052_bl.o | ||
| 32 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o | 33 | obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o |
| 33 | obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o | 34 | obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o |
| 34 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o | 35 | obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o |
diff --git a/drivers/video/backlight/da9052_bl.c b/drivers/video/backlight/da9052_bl.c new file mode 100644 index 000000000000..b628d68f5162 --- /dev/null +++ b/drivers/video/backlight/da9052_bl.c | |||
| @@ -0,0 +1,187 @@ | |||
| 1 | /* | ||
| 2 | * Backlight Driver for Dialog DA9052 PMICs | ||
| 3 | * | ||
| 4 | * Copyright(c) 2012 Dialog Semiconductor Ltd. | ||
| 5 | * | ||
| 6 | * Author: David Dajun Chen <dchen@diasemi.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/backlight.h> | ||
| 16 | #include <linux/delay.h> | ||
| 17 | #include <linux/fb.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/platform_device.h> | ||
| 20 | |||
| 21 | #include <linux/mfd/da9052/da9052.h> | ||
| 22 | #include <linux/mfd/da9052/reg.h> | ||
| 23 | |||
| 24 | #define DA9052_MAX_BRIGHTNESS 0xFF | ||
| 25 | |||
| 26 | enum { | ||
| 27 | DA9052_WLEDS_OFF, | ||
| 28 | DA9052_WLEDS_ON, | ||
| 29 | }; | ||
| 30 | |||
| 31 | enum { | ||
| 32 | DA9052_TYPE_WLED1, | ||
| 33 | DA9052_TYPE_WLED2, | ||
| 34 | DA9052_TYPE_WLED3, | ||
| 35 | }; | ||
| 36 | |||
| 37 | static unsigned char wled_bank[] = { | ||
| 38 | DA9052_LED1_CONF_REG, | ||
| 39 | DA9052_LED2_CONF_REG, | ||
| 40 | DA9052_LED3_CONF_REG, | ||
| 41 | }; | ||
| 42 | |||
| 43 | struct da9052_bl { | ||
| 44 | struct da9052 *da9052; | ||
| 45 | uint brightness; | ||
| 46 | uint state; | ||
| 47 | uint led_reg; | ||
| 48 | }; | ||
| 49 | |||
| 50 | static int da9052_adjust_wled_brightness(struct da9052_bl *wleds) | ||
| 51 | { | ||
| 52 | unsigned char boost_en; | ||
| 53 | unsigned char i_sink; | ||
| 54 | int ret; | ||
| 55 | |||
| 56 | boost_en = 0x3F; | ||
| 57 | i_sink = 0xFF; | ||
| 58 | if (wleds->state == DA9052_WLEDS_OFF) { | ||
| 59 | boost_en = 0x00; | ||
| 60 | i_sink = 0x00; | ||
| 61 | } | ||
| 62 | |||
| 63 | ret = da9052_reg_write(wleds->da9052, DA9052_BOOST_REG, boost_en); | ||
| 64 | if (ret < 0) | ||
| 65 | return ret; | ||
| 66 | |||
| 67 | ret = da9052_reg_write(wleds->da9052, DA9052_LED_CONT_REG, i_sink); | ||
| 68 | if (ret < 0) | ||
| 69 | return ret; | ||
| 70 | |||
| 71 | ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], 0x0); | ||
| 72 | if (ret < 0) | ||
| 73 | return ret; | ||
| 74 | |||
| 75 | msleep(10); | ||
| 76 | |||
| 77 | if (wleds->brightness) { | ||
| 78 | ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], | ||
| 79 | wleds->brightness); | ||
| 80 | if (ret < 0) | ||
| 81 | return ret; | ||
| 82 | } | ||
| 83 | |||
| 84 | return 0; | ||
| 85 | } | ||
| 86 | |||
| 87 | static int da9052_backlight_update_status(struct backlight_device *bl) | ||
| 88 | { | ||
| 89 | int brightness = bl->props.brightness; | ||
| 90 | struct da9052_bl *wleds = bl_get_data(bl); | ||
| 91 | |||
| 92 | wleds->brightness = brightness; | ||
| 93 | wleds->state = DA9052_WLEDS_ON; | ||
| 94 | |||
| 95 | return da9052_adjust_wled_brightness(wleds); | ||
| 96 | } | ||
| 97 | |||
| 98 | static int da9052_backlight_get_brightness(struct backlight_device *bl) | ||
| 99 | { | ||
| 100 | struct da9052_bl *wleds = bl_get_data(bl); | ||
| 101 | |||
| 102 | return wleds->brightness; | ||
| 103 | } | ||
| 104 | |||
| 105 | static const struct backlight_ops da9052_backlight_ops = { | ||
| 106 | .update_status = da9052_backlight_update_status, | ||
| 107 | .get_brightness = da9052_backlight_get_brightness, | ||
| 108 | }; | ||
| 109 | |||
| 110 | static int da9052_backlight_probe(struct platform_device *pdev) | ||
| 111 | { | ||
| 112 | struct backlight_device *bl; | ||
| 113 | struct backlight_properties props; | ||
| 114 | struct da9052_bl *wleds; | ||
| 115 | |||
| 116 | wleds = devm_kzalloc(&pdev->dev, sizeof(struct da9052_bl), GFP_KERNEL); | ||
| 117 | if (!wleds) | ||
| 118 | return -ENOMEM; | ||
| 119 | |||
| 120 | wleds->da9052 = dev_get_drvdata(pdev->dev.parent); | ||
| 121 | wleds->brightness = 0; | ||
| 122 | wleds->led_reg = platform_get_device_id(pdev)->driver_data; | ||
| 123 | wleds->state = DA9052_WLEDS_OFF; | ||
| 124 | |||
| 125 | props.type = BACKLIGHT_RAW; | ||
| 126 | props.max_brightness = DA9052_MAX_BRIGHTNESS; | ||
| 127 | |||
| 128 | bl = backlight_device_register(pdev->name, wleds->da9052->dev, wleds, | ||
| 129 | &da9052_backlight_ops, &props); | ||
| 130 | if (IS_ERR(bl)) { | ||
| 131 | dev_err(&pdev->dev, "Failed to register backlight\n"); | ||
| 132 | devm_kfree(&pdev->dev, wleds); | ||
| 133 | return PTR_ERR(bl); | ||
| 134 | } | ||
| 135 | |||
| 136 | bl->props.max_brightness = DA9052_MAX_BRIGHTNESS; | ||
| 137 | bl->props.brightness = 0; | ||
| 138 | platform_set_drvdata(pdev, bl); | ||
| 139 | |||
| 140 | return da9052_adjust_wled_brightness(wleds); | ||
| 141 | } | ||
| 142 | |||
| 143 | static int da9052_backlight_remove(struct platform_device *pdev) | ||
| 144 | { | ||
| 145 | struct backlight_device *bl = platform_get_drvdata(pdev); | ||
| 146 | struct da9052_bl *wleds = bl_get_data(bl); | ||
| 147 | |||
| 148 | wleds->brightness = 0; | ||
| 149 | wleds->state = DA9052_WLEDS_OFF; | ||
| 150 | da9052_adjust_wled_brightness(wleds); | ||
| 151 | backlight_device_unregister(bl); | ||
| 152 | devm_kfree(&pdev->dev, wleds); | ||
| 153 | |||
| 154 | return 0; | ||
| 155 | } | ||
| 156 | |||
| 157 | static struct platform_device_id da9052_wled_ids[] = { | ||
| 158 | { | ||
| 159 | .name = "da9052-wled1", | ||
| 160 | .driver_data = DA9052_TYPE_WLED1, | ||
| 161 | }, | ||
| 162 | { | ||
| 163 | .name = "da9052-wled2", | ||
| 164 | .driver_data = DA9052_TYPE_WLED2, | ||
| 165 | }, | ||
| 166 | { | ||
| 167 | .name = "da9052-wled3", | ||
| 168 | .driver_data = DA9052_TYPE_WLED3, | ||
| 169 | }, | ||
| 170 | }; | ||
| 171 | |||
| 172 | static struct platform_driver da9052_wled_driver = { | ||
| 173 | .probe = da9052_backlight_probe, | ||
| 174 | .remove = da9052_backlight_remove, | ||
| 175 | .id_table = da9052_wled_ids, | ||
| 176 | .driver = { | ||
| 177 | .name = "da9052-wled", | ||
| 178 | .owner = THIS_MODULE, | ||
| 179 | }, | ||
| 180 | }; | ||
| 181 | |||
| 182 | module_platform_driver(da9052_wled_driver); | ||
| 183 | |||
| 184 | MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); | ||
| 185 | MODULE_DESCRIPTION("Backlight driver for DA9052 PMIC"); | ||
| 186 | MODULE_LICENSE("GPL"); | ||
| 187 | MODULE_ALIAS("platform:da9052-backlight"); | ||
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c index be20b5cbe26c..3a6d5419e3e3 100644 --- a/drivers/video/backlight/locomolcd.c +++ b/drivers/video/backlight/locomolcd.c | |||
| @@ -229,14 +229,7 @@ static struct locomo_driver poodle_lcd_driver = { | |||
| 229 | 229 | ||
| 230 | static int __init locomolcd_init(void) | 230 | static int __init locomolcd_init(void) |
| 231 | { | 231 | { |
| 232 | int ret = locomo_driver_register(&poodle_lcd_driver); | 232 | return locomo_driver_register(&poodle_lcd_driver); |
| 233 | if (ret) | ||
| 234 | return ret; | ||
| 235 | |||
| 236 | #ifdef CONFIG_SA1100_COLLIE | ||
| 237 | sa1100fb_lcd_power = locomolcd_power; | ||
| 238 | #endif | ||
| 239 | return 0; | ||
| 240 | } | 233 | } |
| 241 | 234 | ||
| 242 | static void __exit locomolcd_exit(void) | 235 | static void __exit locomolcd_exit(void) |
diff --git a/drivers/xen/xen-pciback/pciback_ops.c b/drivers/xen/xen-pciback/pciback_ops.c index 63616d7453e6..97f5d264c31e 100644 --- a/drivers/xen/xen-pciback/pciback_ops.c +++ b/drivers/xen/xen-pciback/pciback_ops.c | |||
| @@ -234,7 +234,7 @@ int xen_pcibk_enable_msix(struct xen_pcibk_device *pdev, | |||
| 234 | if (dev_data) | 234 | if (dev_data) |
| 235 | dev_data->ack_intr = 0; | 235 | dev_data->ack_intr = 0; |
| 236 | 236 | ||
| 237 | return result; | 237 | return result > 0 ? 0 : result; |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | static | 240 | static |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 8fecc99be344..f52c5ab78f9d 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -3892,13 +3892,12 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid, | |||
| 3892 | int rc = 0; | 3892 | int rc = 0; |
| 3893 | int bytes_returned = 0; | 3893 | int bytes_returned = 0; |
| 3894 | SET_SEC_DESC_REQ *pSMB = NULL; | 3894 | SET_SEC_DESC_REQ *pSMB = NULL; |
| 3895 | NTRANSACT_RSP *pSMBr = NULL; | 3895 | void *pSMBr; |
| 3896 | 3896 | ||
| 3897 | setCifsAclRetry: | 3897 | setCifsAclRetry: |
| 3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, | 3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, &pSMBr); |
| 3899 | (void **) &pSMBr); | ||
| 3900 | if (rc) | 3899 | if (rc) |
| 3901 | return (rc); | 3900 | return rc; |
| 3902 | 3901 | ||
| 3903 | pSMB->MaxSetupCount = 0; | 3902 | pSMB->MaxSetupCount = 0; |
| 3904 | pSMB->Reserved = 0; | 3903 | pSMB->Reserved = 0; |
| @@ -3926,9 +3925,8 @@ setCifsAclRetry: | |||
| 3926 | pSMB->AclFlags = cpu_to_le32(aclflag); | 3925 | pSMB->AclFlags = cpu_to_le32(aclflag); |
| 3927 | 3926 | ||
| 3928 | if (pntsd && acllen) { | 3927 | if (pntsd && acllen) { |
| 3929 | memcpy((char *) &pSMBr->hdr.Protocol + data_offset, | 3928 | memcpy((char *)pSMBr + offsetof(struct smb_hdr, Protocol) + |
| 3930 | (char *) pntsd, | 3929 | data_offset, pntsd, acllen); |
| 3931 | acllen); | ||
| 3932 | inc_rfc1001_len(pSMB, byte_count + data_count); | 3930 | inc_rfc1001_len(pSMB, byte_count + data_count); |
| 3933 | } else | 3931 | } else |
| 3934 | inc_rfc1001_len(pSMB, byte_count); | 3932 | inc_rfc1001_len(pSMB, byte_count); |
| @@ -5708,7 +5706,8 @@ CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
| 5708 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5706 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
| 5709 | offset = param_offset + params; | 5707 | offset = param_offset + params; |
| 5710 | 5708 | ||
| 5711 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 5709 | data_offset = (char *)pSMB + |
| 5710 | offsetof(struct smb_hdr, Protocol) + offset; | ||
| 5712 | 5711 | ||
| 5713 | count = sizeof(FILE_BASIC_INFO); | 5712 | count = sizeof(FILE_BASIC_INFO); |
| 5714 | pSMB->MaxParameterCount = cpu_to_le16(2); | 5713 | pSMB->MaxParameterCount = cpu_to_le16(2); |
| @@ -5977,7 +5976,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
| 5977 | u16 fid, u32 pid_of_opener) | 5976 | u16 fid, u32 pid_of_opener) |
| 5978 | { | 5977 | { |
| 5979 | struct smb_com_transaction2_sfi_req *pSMB = NULL; | 5978 | struct smb_com_transaction2_sfi_req *pSMB = NULL; |
| 5980 | FILE_UNIX_BASIC_INFO *data_offset; | 5979 | char *data_offset; |
| 5981 | int rc = 0; | 5980 | int rc = 0; |
| 5982 | u16 params, param_offset, offset, byte_count, count; | 5981 | u16 params, param_offset, offset, byte_count, count; |
| 5983 | 5982 | ||
| @@ -5999,8 +5998,9 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
| 5999 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5998 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
| 6000 | offset = param_offset + params; | 5999 | offset = param_offset + params; |
| 6001 | 6000 | ||
| 6002 | data_offset = (FILE_UNIX_BASIC_INFO *) | 6001 | data_offset = (char *)pSMB + |
| 6003 | ((char *)(&pSMB->hdr.Protocol) + offset); | 6002 | offsetof(struct smb_hdr, Protocol) + offset; |
| 6003 | |||
| 6004 | count = sizeof(FILE_UNIX_BASIC_INFO); | 6004 | count = sizeof(FILE_UNIX_BASIC_INFO); |
| 6005 | 6005 | ||
| 6006 | pSMB->MaxParameterCount = cpu_to_le16(2); | 6006 | pSMB->MaxParameterCount = cpu_to_le16(2); |
| @@ -6022,7 +6022,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
| 6022 | inc_rfc1001_len(pSMB, byte_count); | 6022 | inc_rfc1001_len(pSMB, byte_count); |
| 6023 | pSMB->ByteCount = cpu_to_le16(byte_count); | 6023 | pSMB->ByteCount = cpu_to_le16(byte_count); |
| 6024 | 6024 | ||
| 6025 | cifs_fill_unix_set_info(data_offset, args); | 6025 | cifs_fill_unix_set_info((FILE_UNIX_BASIC_INFO *)data_offset, args); |
| 6026 | 6026 | ||
| 6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); | 6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); |
| 6028 | if (rc) | 6028 | if (rc) |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 302a15c505a9..d81e933a796b 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -1565,8 +1565,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1565 | 1565 | ||
| 1566 | /* Obtain the value string */ | 1566 | /* Obtain the value string */ |
| 1567 | value = strchr(data, '='); | 1567 | value = strchr(data, '='); |
| 1568 | if (value != NULL) | 1568 | value++; |
| 1569 | *value++ = '\0'; | ||
| 1570 | 1569 | ||
| 1571 | /* Set tmp_end to end of the string */ | 1570 | /* Set tmp_end to end of the string */ |
| 1572 | tmp_end = (char *) value + strlen(value); | 1571 | tmp_end = (char *) value + strlen(value); |
| @@ -1649,6 +1648,13 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1649 | goto cifs_parse_mount_err; | 1648 | goto cifs_parse_mount_err; |
| 1650 | } | 1649 | } |
| 1651 | 1650 | ||
| 1651 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
| 1652 | if (vol->UNC == NULL) { | ||
| 1653 | printk(KERN_WARNING "CIFS: no memory for UNC\n"); | ||
| 1654 | goto cifs_parse_mount_err; | ||
| 1655 | } | ||
| 1656 | strcpy(vol->UNC, string); | ||
| 1657 | |||
| 1652 | if (strncmp(string, "//", 2) == 0) { | 1658 | if (strncmp(string, "//", 2) == 0) { |
| 1653 | vol->UNC[0] = '\\'; | 1659 | vol->UNC[0] = '\\'; |
| 1654 | vol->UNC[1] = '\\'; | 1660 | vol->UNC[1] = '\\'; |
| @@ -1658,13 +1664,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
| 1658 | goto cifs_parse_mount_err; | 1664 | goto cifs_parse_mount_err; |
| 1659 | } | 1665 | } |
| 1660 | 1666 | ||
| 1661 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
| 1662 | if (vol->UNC == NULL) { | ||
| 1663 | printk(KERN_WARNING "CIFS: no memory " | ||
| 1664 | "for UNC\n"); | ||
| 1665 | goto cifs_parse_mount_err; | ||
| 1666 | } | ||
| 1667 | strcpy(vol->UNC, string); | ||
| 1668 | break; | 1667 | break; |
| 1669 | case Opt_domain: | 1668 | case Opt_domain: |
| 1670 | string = match_strdup(args); | 1669 | string = match_strdup(args); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 460d87b7cda0..fae765dac934 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock) | |||
| 835 | if ((flock->fl_flags & FL_POSIX) == 0) | 835 | if ((flock->fl_flags & FL_POSIX) == 0) |
| 836 | return rc; | 836 | return rc; |
| 837 | 837 | ||
| 838 | try_again: | ||
| 838 | mutex_lock(&cinode->lock_mutex); | 839 | mutex_lock(&cinode->lock_mutex); |
| 839 | if (!cinode->can_cache_brlcks) { | 840 | if (!cinode->can_cache_brlcks) { |
| 840 | mutex_unlock(&cinode->lock_mutex); | 841 | mutex_unlock(&cinode->lock_mutex); |
| 841 | return rc; | 842 | return rc; |
| 842 | } | 843 | } |
| 843 | rc = posix_lock_file_wait(file, flock); | 844 | |
| 845 | rc = posix_lock_file(file, flock, NULL); | ||
| 844 | mutex_unlock(&cinode->lock_mutex); | 846 | mutex_unlock(&cinode->lock_mutex); |
| 847 | if (rc == FILE_LOCK_DEFERRED) { | ||
| 848 | rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next); | ||
| 849 | if (!rc) | ||
| 850 | goto try_again; | ||
| 851 | locks_delete_block(flock); | ||
| 852 | } | ||
| 845 | return rc; | 853 | return rc; |
| 846 | } | 854 | } |
| 847 | 855 | ||
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index dd23a321bdda..581c225f7f50 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c | |||
| @@ -197,8 +197,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) | |||
| 197 | memcpy(scope_id, pct + 1, slen); | 197 | memcpy(scope_id, pct + 1, slen); |
| 198 | scope_id[slen] = '\0'; | 198 | scope_id[slen] = '\0'; |
| 199 | 199 | ||
| 200 | rc = strict_strtoul(scope_id, 0, | 200 | rc = kstrtouint(scope_id, 0, &s6->sin6_scope_id); |
| 201 | (unsigned long *)&s6->sin6_scope_id); | ||
| 202 | rc = (rc == 0) ? 1 : 0; | 201 | rc = (rc == 0) ? 1 : 0; |
| 203 | } | 202 | } |
| 204 | 203 | ||
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 21e93605161c..5dfafdd1dbd3 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
| @@ -33,18 +33,10 @@ static ssize_t default_write_file(struct file *file, const char __user *buf, | |||
| 33 | return count; | 33 | return count; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | static int default_open(struct inode *inode, struct file *file) | ||
| 37 | { | ||
| 38 | if (inode->i_private) | ||
| 39 | file->private_data = inode->i_private; | ||
| 40 | |||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | |||
| 44 | const struct file_operations debugfs_file_operations = { | 36 | const struct file_operations debugfs_file_operations = { |
| 45 | .read = default_read_file, | 37 | .read = default_read_file, |
| 46 | .write = default_write_file, | 38 | .write = default_write_file, |
| 47 | .open = default_open, | 39 | .open = simple_open, |
| 48 | .llseek = noop_llseek, | 40 | .llseek = noop_llseek, |
| 49 | }; | 41 | }; |
| 50 | 42 | ||
| @@ -447,7 +439,7 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf, | |||
| 447 | static const struct file_operations fops_bool = { | 439 | static const struct file_operations fops_bool = { |
| 448 | .read = read_file_bool, | 440 | .read = read_file_bool, |
| 449 | .write = write_file_bool, | 441 | .write = write_file_bool, |
| 450 | .open = default_open, | 442 | .open = simple_open, |
| 451 | .llseek = default_llseek, | 443 | .llseek = default_llseek, |
| 452 | }; | 444 | }; |
| 453 | 445 | ||
| @@ -492,7 +484,7 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, | |||
| 492 | 484 | ||
| 493 | static const struct file_operations fops_blob = { | 485 | static const struct file_operations fops_blob = { |
| 494 | .read = read_file_blob, | 486 | .read = read_file_blob, |
| 495 | .open = default_open, | 487 | .open = simple_open, |
| 496 | .llseek = default_llseek, | 488 | .llseek = default_llseek, |
| 497 | }; | 489 | }; |
| 498 | 490 | ||
diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c index 3dca2b39e83f..1c9b08095f98 100644 --- a/fs/dlm/debug_fs.c +++ b/fs/dlm/debug_fs.c | |||
| @@ -609,13 +609,6 @@ static const struct file_operations format3_fops = { | |||
| 609 | /* | 609 | /* |
| 610 | * dump lkb's on the ls_waiters list | 610 | * dump lkb's on the ls_waiters list |
| 611 | */ | 611 | */ |
| 612 | |||
| 613 | static int waiters_open(struct inode *inode, struct file *file) | ||
| 614 | { | ||
| 615 | file->private_data = inode->i_private; | ||
| 616 | return 0; | ||
| 617 | } | ||
| 618 | |||
| 619 | static ssize_t waiters_read(struct file *file, char __user *userbuf, | 612 | static ssize_t waiters_read(struct file *file, char __user *userbuf, |
| 620 | size_t count, loff_t *ppos) | 613 | size_t count, loff_t *ppos) |
| 621 | { | 614 | { |
| @@ -644,7 +637,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf, | |||
| 644 | 637 | ||
| 645 | static const struct file_operations waiters_fops = { | 638 | static const struct file_operations waiters_fops = { |
| 646 | .owner = THIS_MODULE, | 639 | .owner = THIS_MODULE, |
| 647 | .open = waiters_open, | 640 | .open = simple_open, |
| 648 | .read = waiters_read, | 641 | .read = waiters_read, |
| 649 | .llseek = default_llseek, | 642 | .llseek = default_llseek, |
| 650 | }; | 643 | }; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index ea251749d9d5..28cf06e4ec84 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -1031,7 +1031,6 @@ static int __init init_hugetlbfs_fs(void) | |||
| 1031 | } | 1031 | } |
| 1032 | 1032 | ||
| 1033 | error = PTR_ERR(vfsmount); | 1033 | error = PTR_ERR(vfsmount); |
| 1034 | unregister_filesystem(&hugetlbfs_fs_type); | ||
| 1035 | 1034 | ||
| 1036 | out: | 1035 | out: |
| 1037 | kmem_cache_destroy(hugetlbfs_inode_cachep); | 1036 | kmem_cache_destroy(hugetlbfs_inode_cachep); |
diff --git a/fs/libfs.c b/fs/libfs.c index 4a0d1f06da57..358094f0433d 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
| @@ -264,6 +264,13 @@ Enomem: | |||
| 264 | return ERR_PTR(-ENOMEM); | 264 | return ERR_PTR(-ENOMEM); |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | int simple_open(struct inode *inode, struct file *file) | ||
| 268 | { | ||
| 269 | if (inode->i_private) | ||
| 270 | file->private_data = inode->i_private; | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | |||
| 267 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | 274 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) |
| 268 | { | 275 | { |
| 269 | struct inode *inode = old_dentry->d_inode; | 276 | struct inode *inode = old_dentry->d_inode; |
| @@ -984,6 +991,7 @@ EXPORT_SYMBOL(simple_dir_operations); | |||
| 984 | EXPORT_SYMBOL(simple_empty); | 991 | EXPORT_SYMBOL(simple_empty); |
| 985 | EXPORT_SYMBOL(simple_fill_super); | 992 | EXPORT_SYMBOL(simple_fill_super); |
| 986 | EXPORT_SYMBOL(simple_getattr); | 993 | EXPORT_SYMBOL(simple_getattr); |
| 994 | EXPORT_SYMBOL(simple_open); | ||
| 987 | EXPORT_SYMBOL(simple_link); | 995 | EXPORT_SYMBOL(simple_link); |
| 988 | EXPORT_SYMBOL(simple_lookup); | 996 | EXPORT_SYMBOL(simple_lookup); |
| 989 | EXPORT_SYMBOL(simple_pin_fs); | 997 | EXPORT_SYMBOL(simple_pin_fs); |
diff --git a/fs/locks.c b/fs/locks.c index 637694bf3a03..0d68f1f81799 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter) | |||
| 510 | 510 | ||
| 511 | /* | 511 | /* |
| 512 | */ | 512 | */ |
| 513 | static void locks_delete_block(struct file_lock *waiter) | 513 | void locks_delete_block(struct file_lock *waiter) |
| 514 | { | 514 | { |
| 515 | lock_flocks(); | 515 | lock_flocks(); |
| 516 | __locks_delete_block(waiter); | 516 | __locks_delete_block(waiter); |
| 517 | unlock_flocks(); | 517 | unlock_flocks(); |
| 518 | } | 518 | } |
| 519 | EXPORT_SYMBOL(locks_delete_block); | ||
| 519 | 520 | ||
| 520 | /* Insert waiter into blocker's block list. | 521 | /* Insert waiter into blocker's block list. |
| 521 | * We use a circular list so that processes can be easily woken up in | 522 | * We use a circular list so that processes can be easily woken up in |
diff --git a/fs/namei.c b/fs/namei.c index 1898198abc3d..0062dd17eb55 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1407,18 +1407,9 @@ static inline int can_lookup(struct inode *inode) | |||
| 1407 | */ | 1407 | */ |
| 1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS | 1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS |
| 1409 | 1409 | ||
| 1410 | #ifdef CONFIG_64BIT | 1410 | #include <asm/word-at-a-time.h> |
| 1411 | 1411 | ||
| 1412 | /* | 1412 | #ifdef CONFIG_64BIT |
| 1413 | * Jan Achrenius on G+: microoptimized version of | ||
| 1414 | * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" | ||
| 1415 | * that works for the bytemasks without having to | ||
| 1416 | * mask them first. | ||
| 1417 | */ | ||
| 1418 | static inline long count_masked_bytes(unsigned long mask) | ||
| 1419 | { | ||
| 1420 | return mask*0x0001020304050608ul >> 56; | ||
| 1421 | } | ||
| 1422 | 1413 | ||
| 1423 | static inline unsigned int fold_hash(unsigned long hash) | 1414 | static inline unsigned int fold_hash(unsigned long hash) |
| 1424 | { | 1415 | { |
| @@ -1428,15 +1419,6 @@ static inline unsigned int fold_hash(unsigned long hash) | |||
| 1428 | 1419 | ||
| 1429 | #else /* 32-bit case */ | 1420 | #else /* 32-bit case */ |
| 1430 | 1421 | ||
| 1431 | /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ | ||
| 1432 | static inline long count_masked_bytes(long mask) | ||
| 1433 | { | ||
| 1434 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
| 1435 | long a = (0x0ff0001+mask) >> 23; | ||
| 1436 | /* Fix the 1 for 00 case */ | ||
| 1437 | return a & mask; | ||
| 1438 | } | ||
| 1439 | |||
| 1440 | #define fold_hash(x) (x) | 1422 | #define fold_hash(x) (x) |
| 1441 | 1423 | ||
| 1442 | #endif | 1424 | #endif |
| @@ -1464,17 +1446,6 @@ done: | |||
| 1464 | } | 1446 | } |
| 1465 | EXPORT_SYMBOL(full_name_hash); | 1447 | EXPORT_SYMBOL(full_name_hash); |
| 1466 | 1448 | ||
| 1467 | #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) | ||
| 1468 | #define ONEBYTES REPEAT_BYTE(0x01) | ||
| 1469 | #define SLASHBYTES REPEAT_BYTE('/') | ||
| 1470 | #define HIGHBITS REPEAT_BYTE(0x80) | ||
| 1471 | |||
| 1472 | /* Return the high bit set in the first byte that is a zero */ | ||
| 1473 | static inline unsigned long has_zero(unsigned long a) | ||
| 1474 | { | ||
| 1475 | return ((a - ONEBYTES) & ~a) & HIGHBITS; | ||
| 1476 | } | ||
| 1477 | |||
| 1478 | /* | 1449 | /* |
| 1479 | * Calculate the length and hash of the path component, and | 1450 | * Calculate the length and hash of the path component, and |
| 1480 | * return the length of the component; | 1451 | * return the length of the component; |
| @@ -1490,7 +1461,7 @@ static inline unsigned long hash_name(const char *name, unsigned int *hashp) | |||
| 1490 | len += sizeof(unsigned long); | 1461 | len += sizeof(unsigned long); |
| 1491 | a = *(unsigned long *)(name+len); | 1462 | a = *(unsigned long *)(name+len); |
| 1492 | /* Do we have any NUL or '/' bytes in this word? */ | 1463 | /* Do we have any NUL or '/' bytes in this word? */ |
| 1493 | mask = has_zero(a) | has_zero(a ^ SLASHBYTES); | 1464 | mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/')); |
| 1494 | } while (!mask); | 1465 | } while (!mask); |
| 1495 | 1466 | ||
| 1496 | /* The mask *below* the first high bit set */ | 1467 | /* The mask *below* the first high bit set */ |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 46a15d8a29ca..eed44bfc85db 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
| @@ -115,12 +115,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, | |||
| 115 | if (IS_ERR(sb)) | 115 | if (IS_ERR(sb)) |
| 116 | return ERR_CAST(sb); | 116 | return ERR_CAST(sb); |
| 117 | 117 | ||
| 118 | if (!proc_parse_options(options, ns)) { | ||
| 119 | deactivate_locked_super(sb); | ||
| 120 | return ERR_PTR(-EINVAL); | ||
| 121 | } | ||
| 122 | |||
| 118 | if (!sb->s_root) { | 123 | if (!sb->s_root) { |
| 119 | sb->s_flags = flags; | 124 | sb->s_flags = flags; |
| 120 | if (!proc_parse_options(options, ns)) { | ||
| 121 | deactivate_locked_super(sb); | ||
| 122 | return ERR_PTR(-EINVAL); | ||
| 123 | } | ||
| 124 | err = proc_fill_super(sb); | 125 | err = proc_fill_super(sb); |
| 125 | if (err) { | 126 | if (err) { |
| 126 | deactivate_locked_super(sb); | 127 | deactivate_locked_super(sb); |
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 50952c9bd06c..19507889bb7f 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c | |||
| @@ -52,12 +52,6 @@ struct pstore_private { | |||
| 52 | char data[]; | 52 | char data[]; |
| 53 | }; | 53 | }; |
| 54 | 54 | ||
| 55 | static int pstore_file_open(struct inode *inode, struct file *file) | ||
| 56 | { | ||
| 57 | file->private_data = inode->i_private; | ||
| 58 | return 0; | ||
| 59 | } | ||
| 60 | |||
| 61 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | 55 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, |
| 62 | size_t count, loff_t *ppos) | 56 | size_t count, loff_t *ppos) |
| 63 | { | 57 | { |
| @@ -67,7 +61,7 @@ static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | |||
| 67 | } | 61 | } |
| 68 | 62 | ||
| 69 | static const struct file_operations pstore_file_operations = { | 63 | static const struct file_operations pstore_file_operations = { |
| 70 | .open = pstore_file_open, | 64 | .open = simple_open, |
| 71 | .read = pstore_file_read, | 65 | .read = pstore_file_read, |
| 72 | .llseek = default_llseek, | 66 | .llseek = default_llseek, |
| 73 | }; | 67 | }; |
diff --git a/fs/splice.c b/fs/splice.c index 5f883de7ef3a..f8476841eb04 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/uio.h> | 30 | #include <linux/uio.h> |
| 31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
| 32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
| 33 | #include <linux/socket.h> | ||
| 33 | 34 | ||
| 34 | /* | 35 | /* |
| 35 | * Attempt to steal a page from a pipe buffer. This should perhaps go into | 36 | * Attempt to steal a page from a pipe buffer. This should perhaps go into |
| @@ -690,7 +691,9 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
| 690 | if (!likely(file->f_op && file->f_op->sendpage)) | 691 | if (!likely(file->f_op && file->f_op->sendpage)) |
| 691 | return -EINVAL; | 692 | return -EINVAL; |
| 692 | 693 | ||
| 693 | more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len; | 694 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
| 695 | if (sd->len < sd->total_len) | ||
| 696 | more |= MSG_SENDPAGE_NOTLAST; | ||
| 694 | return file->f_op->sendpage(file, buf->page, buf->offset, | 697 | return file->f_op->sendpage(file, buf->page, buf->offset, |
| 695 | sd->len, &pos, more); | 698 | sd->len, &pos, more); |
| 696 | } | 699 | } |
diff --git a/fs/xattr.c b/fs/xattr.c index d6dfd247bb2f..3c8c1cc333c7 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
| @@ -19,8 +19,9 @@ | |||
| 19 | #include <linux/export.h> | 19 | #include <linux/export.h> |
| 20 | #include <linux/fsnotify.h> | 20 | #include <linux/fsnotify.h> |
| 21 | #include <linux/audit.h> | 21 | #include <linux/audit.h> |
| 22 | #include <asm/uaccess.h> | 22 | #include <linux/vmalloc.h> |
| 23 | 23 | ||
| 24 | #include <asm/uaccess.h> | ||
| 24 | 25 | ||
| 25 | /* | 26 | /* |
| 26 | * Check permissions for extended attribute access. This is a bit complicated | 27 | * Check permissions for extended attribute access. This is a bit complicated |
| @@ -320,6 +321,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
| 320 | { | 321 | { |
| 321 | int error; | 322 | int error; |
| 322 | void *kvalue = NULL; | 323 | void *kvalue = NULL; |
| 324 | void *vvalue = NULL; /* If non-NULL, we used vmalloc() */ | ||
| 323 | char kname[XATTR_NAME_MAX + 1]; | 325 | char kname[XATTR_NAME_MAX + 1]; |
| 324 | 326 | ||
| 325 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) | 327 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) |
| @@ -334,13 +336,25 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
| 334 | if (size) { | 336 | if (size) { |
| 335 | if (size > XATTR_SIZE_MAX) | 337 | if (size > XATTR_SIZE_MAX) |
| 336 | return -E2BIG; | 338 | return -E2BIG; |
| 337 | kvalue = memdup_user(value, size); | 339 | kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
| 338 | if (IS_ERR(kvalue)) | 340 | if (!kvalue) { |
| 339 | return PTR_ERR(kvalue); | 341 | vvalue = vmalloc(size); |
| 342 | if (!vvalue) | ||
| 343 | return -ENOMEM; | ||
| 344 | kvalue = vvalue; | ||
| 345 | } | ||
| 346 | if (copy_from_user(kvalue, value, size)) { | ||
| 347 | error = -EFAULT; | ||
| 348 | goto out; | ||
| 349 | } | ||
| 340 | } | 350 | } |
| 341 | 351 | ||
| 342 | error = vfs_setxattr(d, kname, kvalue, size, flags); | 352 | error = vfs_setxattr(d, kname, kvalue, size, flags); |
| 343 | kfree(kvalue); | 353 | out: |
| 354 | if (vvalue) | ||
| 355 | vfree(vvalue); | ||
| 356 | else | ||
| 357 | kfree(kvalue); | ||
| 344 | return error; | 358 | return error; |
| 345 | } | 359 | } |
| 346 | 360 | ||
| @@ -492,13 +506,18 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
| 492 | { | 506 | { |
| 493 | ssize_t error; | 507 | ssize_t error; |
| 494 | char *klist = NULL; | 508 | char *klist = NULL; |
| 509 | char *vlist = NULL; /* If non-NULL, we used vmalloc() */ | ||
| 495 | 510 | ||
| 496 | if (size) { | 511 | if (size) { |
| 497 | if (size > XATTR_LIST_MAX) | 512 | if (size > XATTR_LIST_MAX) |
| 498 | size = XATTR_LIST_MAX; | 513 | size = XATTR_LIST_MAX; |
| 499 | klist = kmalloc(size, GFP_KERNEL); | 514 | klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); |
| 500 | if (!klist) | 515 | if (!klist) { |
| 501 | return -ENOMEM; | 516 | vlist = vmalloc(size); |
| 517 | if (!vlist) | ||
| 518 | return -ENOMEM; | ||
| 519 | klist = vlist; | ||
| 520 | } | ||
| 502 | } | 521 | } |
| 503 | 522 | ||
| 504 | error = vfs_listxattr(d, klist, size); | 523 | error = vfs_listxattr(d, klist, size); |
| @@ -510,7 +529,10 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
| 510 | than XATTR_LIST_MAX bytes. Not possible. */ | 529 | than XATTR_LIST_MAX bytes. Not possible. */ |
| 511 | error = -E2BIG; | 530 | error = -E2BIG; |
| 512 | } | 531 | } |
| 513 | kfree(klist); | 532 | if (vlist) |
| 533 | vfree(vlist); | ||
| 534 | else | ||
| 535 | kfree(klist); | ||
| 514 | return error; | 536 | return error; |
| 515 | } | 537 | } |
| 516 | 538 | ||
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index e1d9e0ede309..f5647b59a90e 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h | |||
| @@ -896,8 +896,7 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) | |||
| 896 | * | 896 | * |
| 897 | * All operations are optional (i.e. the function pointer may be set | 897 | * All operations are optional (i.e. the function pointer may be set |
| 898 | * to %NULL) and callers must take this into account. Callers must | 898 | * to %NULL) and callers must take this into account. Callers must |
| 899 | * hold the RTNL, except that for @get_drvinfo the caller may or may | 899 | * hold the RTNL lock. |
| 900 | * not hold the RTNL. | ||
| 901 | * | 900 | * |
| 902 | * See the structures used by these operations for further documentation. | 901 | * See the structures used by these operations for further documentation. |
| 903 | * | 902 | * |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 135693e79f2b..8de675523e46 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1215,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); | |||
| 1215 | extern int lease_modify(struct file_lock **, int); | 1215 | extern int lease_modify(struct file_lock **, int); |
| 1216 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); | 1216 | extern int lock_may_read(struct inode *, loff_t start, unsigned long count); |
| 1217 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); | 1217 | extern int lock_may_write(struct inode *, loff_t start, unsigned long count); |
| 1218 | extern void locks_delete_block(struct file_lock *waiter); | ||
| 1218 | extern void lock_flocks(void); | 1219 | extern void lock_flocks(void); |
| 1219 | extern void unlock_flocks(void); | 1220 | extern void unlock_flocks(void); |
| 1220 | #else /* !CONFIG_FILE_LOCKING */ | 1221 | #else /* !CONFIG_FILE_LOCKING */ |
| @@ -1359,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start, | |||
| 1359 | return 1; | 1360 | return 1; |
| 1360 | } | 1361 | } |
| 1361 | 1362 | ||
| 1363 | static inline void locks_delete_block(struct file_lock *waiter) | ||
| 1364 | { | ||
| 1365 | } | ||
| 1366 | |||
| 1362 | static inline void lock_flocks(void) | 1367 | static inline void lock_flocks(void) |
| 1363 | { | 1368 | { |
| 1364 | } | 1369 | } |
| @@ -2506,6 +2511,7 @@ extern int dcache_readdir(struct file *, void *, filldir_t); | |||
| 2506 | extern int simple_setattr(struct dentry *, struct iattr *); | 2511 | extern int simple_setattr(struct dentry *, struct iattr *); |
| 2507 | extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *); | 2512 | extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *); |
| 2508 | extern int simple_statfs(struct dentry *, struct kstatfs *); | 2513 | extern int simple_statfs(struct dentry *, struct kstatfs *); |
| 2514 | extern int simple_open(struct inode *inode, struct file *file); | ||
| 2509 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); | 2515 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); |
| 2510 | extern int simple_unlink(struct inode *, struct dentry *); | 2516 | extern int simple_unlink(struct inode *, struct dentry *); |
| 2511 | extern int simple_rmdir(struct inode *, struct dentry *); | 2517 | extern int simple_rmdir(struct inode *, struct dentry *); |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 1f77540bdc95..5cbaa20f1659 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -2604,8 +2604,6 @@ extern void net_disable_timestamp(void); | |||
| 2604 | extern void *dev_seq_start(struct seq_file *seq, loff_t *pos); | 2604 | extern void *dev_seq_start(struct seq_file *seq, loff_t *pos); |
| 2605 | extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); | 2605 | extern void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos); |
| 2606 | extern void dev_seq_stop(struct seq_file *seq, void *v); | 2606 | extern void dev_seq_stop(struct seq_file *seq, void *v); |
| 2607 | extern int dev_seq_open_ops(struct inode *inode, struct file *file, | ||
| 2608 | const struct seq_operations *ops); | ||
| 2609 | #endif | 2607 | #endif |
| 2610 | 2608 | ||
| 2611 | extern int netdev_class_create_file(struct class_attribute *class_attr); | 2609 | extern int netdev_class_create_file(struct class_attribute *class_attr); |
diff --git a/include/linux/netfilter/xt_set.h b/include/linux/netfilter/xt_set.h index c0405ac92870..e3a9978f259f 100644 --- a/include/linux/netfilter/xt_set.h +++ b/include/linux/netfilter/xt_set.h | |||
| @@ -58,8 +58,8 @@ struct xt_set_info_target_v1 { | |||
| 58 | struct xt_set_info_target_v2 { | 58 | struct xt_set_info_target_v2 { |
| 59 | struct xt_set_info add_set; | 59 | struct xt_set_info add_set; |
| 60 | struct xt_set_info del_set; | 60 | struct xt_set_info del_set; |
| 61 | u32 flags; | 61 | __u32 flags; |
| 62 | u32 timeout; | 62 | __u32 timeout; |
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | #endif /*_XT_SET_H*/ | 65 | #endif /*_XT_SET_H*/ |
diff --git a/include/linux/socket.h b/include/linux/socket.h index da2d3e2543f3..b84bbd48b874 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -265,7 +265,7 @@ struct ucred { | |||
| 265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ | 265 | #define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ |
| 266 | #define MSG_MORE 0x8000 /* Sender will send more */ | 266 | #define MSG_MORE 0x8000 /* Sender will send more */ |
| 267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ | 267 | #define MSG_WAITFORONE 0x10000 /* recvmmsg(): block until 1+ packets avail */ |
| 268 | 268 | #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */ | |
| 269 | #define MSG_EOF MSG_FIN | 269 | #define MSG_EOF MSG_FIN |
| 270 | 270 | ||
| 271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file | 271 | #define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file |
diff --git a/include/linux/swap.h b/include/linux/swap.h index 8dc0ea7caf02..b1fd5c7925fe 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
| @@ -305,6 +305,13 @@ static inline int mem_cgroup_swappiness(struct mem_cgroup *mem) | |||
| 305 | return vm_swappiness; | 305 | return vm_swappiness; |
| 306 | } | 306 | } |
| 307 | #endif | 307 | #endif |
| 308 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
| 309 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | ||
| 310 | #else | ||
| 311 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | ||
| 312 | { | ||
| 313 | } | ||
| 314 | #endif | ||
| 308 | #ifdef CONFIG_SWAP | 315 | #ifdef CONFIG_SWAP |
| 309 | /* linux/mm/page_io.c */ | 316 | /* linux/mm/page_io.c */ |
| 310 | extern int swap_readpage(struct page *); | 317 | extern int swap_readpage(struct page *); |
| @@ -375,13 +382,6 @@ mem_cgroup_uncharge_swapcache(struct page *page, swp_entry_t ent, bool swapout) | |||
| 375 | { | 382 | { |
| 376 | } | 383 | } |
| 377 | #endif | 384 | #endif |
| 378 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP | ||
| 379 | extern void mem_cgroup_uncharge_swap(swp_entry_t ent); | ||
| 380 | #else | ||
| 381 | static inline void mem_cgroup_uncharge_swap(swp_entry_t ent) | ||
| 382 | { | ||
| 383 | } | ||
| 384 | #endif | ||
| 385 | 385 | ||
| 386 | #else /* CONFIG_SWAP */ | 386 | #else /* CONFIG_SWAP */ |
| 387 | 387 | ||
diff --git a/include/net/netfilter/xt_log.h b/include/net/netfilter/xt_log.h index 7e1544e8f70d..9d9756cca013 100644 --- a/include/net/netfilter/xt_log.h +++ b/include/net/netfilter/xt_log.h | |||
| @@ -47,7 +47,7 @@ static void sb_close(struct sbuff *m) | |||
| 47 | if (likely(m != &emergency)) | 47 | if (likely(m != &emergency)) |
| 48 | kfree(m); | 48 | kfree(m); |
| 49 | else { | 49 | else { |
| 50 | xchg(&emergency_ptr, m); | 50 | emergency_ptr = m; |
| 51 | local_bh_enable(); | 51 | local_bh_enable(); |
| 52 | } | 52 | } |
| 53 | } | 53 | } |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index cdea7b56b0c9..c0bd0308741c 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -311,13 +311,6 @@ int blk_trace_remove(struct request_queue *q) | |||
| 311 | } | 311 | } |
| 312 | EXPORT_SYMBOL_GPL(blk_trace_remove); | 312 | EXPORT_SYMBOL_GPL(blk_trace_remove); |
| 313 | 313 | ||
| 314 | static int blk_dropped_open(struct inode *inode, struct file *filp) | ||
| 315 | { | ||
| 316 | filp->private_data = inode->i_private; | ||
| 317 | |||
| 318 | return 0; | ||
| 319 | } | ||
| 320 | |||
| 321 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | 314 | static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, |
| 322 | size_t count, loff_t *ppos) | 315 | size_t count, loff_t *ppos) |
| 323 | { | 316 | { |
| @@ -331,18 +324,11 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer, | |||
| 331 | 324 | ||
| 332 | static const struct file_operations blk_dropped_fops = { | 325 | static const struct file_operations blk_dropped_fops = { |
| 333 | .owner = THIS_MODULE, | 326 | .owner = THIS_MODULE, |
| 334 | .open = blk_dropped_open, | 327 | .open = simple_open, |
| 335 | .read = blk_dropped_read, | 328 | .read = blk_dropped_read, |
| 336 | .llseek = default_llseek, | 329 | .llseek = default_llseek, |
| 337 | }; | 330 | }; |
| 338 | 331 | ||
| 339 | static int blk_msg_open(struct inode *inode, struct file *filp) | ||
| 340 | { | ||
| 341 | filp->private_data = inode->i_private; | ||
| 342 | |||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 346 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | 332 | static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, |
| 347 | size_t count, loff_t *ppos) | 333 | size_t count, loff_t *ppos) |
| 348 | { | 334 | { |
| @@ -371,7 +357,7 @@ static ssize_t blk_msg_write(struct file *filp, const char __user *buffer, | |||
| 371 | 357 | ||
| 372 | static const struct file_operations blk_msg_fops = { | 358 | static const struct file_operations blk_msg_fops = { |
| 373 | .owner = THIS_MODULE, | 359 | .owner = THIS_MODULE, |
| 374 | .open = blk_msg_open, | 360 | .open = simple_open, |
| 375 | .write = blk_msg_write, | 361 | .write = blk_msg_write, |
| 376 | .llseek = noop_llseek, | 362 | .llseek = noop_llseek, |
| 377 | }; | 363 | }; |
diff --git a/net/core/dev.c b/net/core/dev.c index 6c7dc9d78e10..c25d453b2803 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -4028,54 +4028,41 @@ static int dev_ifconf(struct net *net, char __user *arg) | |||
| 4028 | 4028 | ||
| 4029 | #ifdef CONFIG_PROC_FS | 4029 | #ifdef CONFIG_PROC_FS |
| 4030 | 4030 | ||
| 4031 | #define BUCKET_SPACE (32 - NETDEV_HASHBITS) | 4031 | #define BUCKET_SPACE (32 - NETDEV_HASHBITS - 1) |
| 4032 | |||
| 4033 | struct dev_iter_state { | ||
| 4034 | struct seq_net_private p; | ||
| 4035 | unsigned int pos; /* bucket << BUCKET_SPACE + offset */ | ||
| 4036 | }; | ||
| 4037 | 4032 | ||
| 4038 | #define get_bucket(x) ((x) >> BUCKET_SPACE) | 4033 | #define get_bucket(x) ((x) >> BUCKET_SPACE) |
| 4039 | #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1)) | 4034 | #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1)) |
| 4040 | #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o)) | 4035 | #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o)) |
| 4041 | 4036 | ||
| 4042 | static inline struct net_device *dev_from_same_bucket(struct seq_file *seq) | 4037 | static inline struct net_device *dev_from_same_bucket(struct seq_file *seq, loff_t *pos) |
| 4043 | { | 4038 | { |
| 4044 | struct dev_iter_state *state = seq->private; | ||
| 4045 | struct net *net = seq_file_net(seq); | 4039 | struct net *net = seq_file_net(seq); |
| 4046 | struct net_device *dev; | 4040 | struct net_device *dev; |
| 4047 | struct hlist_node *p; | 4041 | struct hlist_node *p; |
| 4048 | struct hlist_head *h; | 4042 | struct hlist_head *h; |
| 4049 | unsigned int count, bucket, offset; | 4043 | unsigned int count = 0, offset = get_offset(*pos); |
| 4050 | 4044 | ||
| 4051 | bucket = get_bucket(state->pos); | 4045 | h = &net->dev_name_head[get_bucket(*pos)]; |
| 4052 | offset = get_offset(state->pos); | ||
| 4053 | h = &net->dev_name_head[bucket]; | ||
| 4054 | count = 0; | ||
| 4055 | hlist_for_each_entry_rcu(dev, p, h, name_hlist) { | 4046 | hlist_for_each_entry_rcu(dev, p, h, name_hlist) { |
| 4056 | if (count++ == offset) { | 4047 | if (++count == offset) |
| 4057 | state->pos = set_bucket_offset(bucket, count); | ||
| 4058 | return dev; | 4048 | return dev; |
| 4059 | } | ||
| 4060 | } | 4049 | } |
| 4061 | 4050 | ||
| 4062 | return NULL; | 4051 | return NULL; |
| 4063 | } | 4052 | } |
| 4064 | 4053 | ||
| 4065 | static inline struct net_device *dev_from_new_bucket(struct seq_file *seq) | 4054 | static inline struct net_device *dev_from_bucket(struct seq_file *seq, loff_t *pos) |
| 4066 | { | 4055 | { |
| 4067 | struct dev_iter_state *state = seq->private; | ||
| 4068 | struct net_device *dev; | 4056 | struct net_device *dev; |
| 4069 | unsigned int bucket; | 4057 | unsigned int bucket; |
| 4070 | 4058 | ||
| 4071 | bucket = get_bucket(state->pos); | ||
| 4072 | do { | 4059 | do { |
| 4073 | dev = dev_from_same_bucket(seq); | 4060 | dev = dev_from_same_bucket(seq, pos); |
| 4074 | if (dev) | 4061 | if (dev) |
| 4075 | return dev; | 4062 | return dev; |
| 4076 | 4063 | ||
| 4077 | bucket++; | 4064 | bucket = get_bucket(*pos) + 1; |
| 4078 | state->pos = set_bucket_offset(bucket, 0); | 4065 | *pos = set_bucket_offset(bucket, 1); |
| 4079 | } while (bucket < NETDEV_HASHENTRIES); | 4066 | } while (bucket < NETDEV_HASHENTRIES); |
| 4080 | 4067 | ||
| 4081 | return NULL; | 4068 | return NULL; |
| @@ -4088,33 +4075,20 @@ static inline struct net_device *dev_from_new_bucket(struct seq_file *seq) | |||
| 4088 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) | 4075 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) |
| 4089 | __acquires(RCU) | 4076 | __acquires(RCU) |
| 4090 | { | 4077 | { |
| 4091 | struct dev_iter_state *state = seq->private; | ||
| 4092 | |||
| 4093 | rcu_read_lock(); | 4078 | rcu_read_lock(); |
| 4094 | if (!*pos) | 4079 | if (!*pos) |
| 4095 | return SEQ_START_TOKEN; | 4080 | return SEQ_START_TOKEN; |
| 4096 | 4081 | ||
| 4097 | /* check for end of the hash */ | 4082 | if (get_bucket(*pos) >= NETDEV_HASHENTRIES) |
| 4098 | if (state->pos == 0 && *pos > 1) | ||
| 4099 | return NULL; | 4083 | return NULL; |
| 4100 | 4084 | ||
| 4101 | return dev_from_new_bucket(seq); | 4085 | return dev_from_bucket(seq, pos); |
| 4102 | } | 4086 | } |
| 4103 | 4087 | ||
| 4104 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 4088 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
| 4105 | { | 4089 | { |
| 4106 | struct net_device *dev; | ||
| 4107 | |||
| 4108 | ++*pos; | 4090 | ++*pos; |
| 4109 | 4091 | return dev_from_bucket(seq, pos); | |
| 4110 | if (v == SEQ_START_TOKEN) | ||
| 4111 | return dev_from_new_bucket(seq); | ||
| 4112 | |||
| 4113 | dev = dev_from_same_bucket(seq); | ||
| 4114 | if (dev) | ||
| 4115 | return dev; | ||
| 4116 | |||
| 4117 | return dev_from_new_bucket(seq); | ||
| 4118 | } | 4092 | } |
| 4119 | 4093 | ||
| 4120 | void dev_seq_stop(struct seq_file *seq, void *v) | 4094 | void dev_seq_stop(struct seq_file *seq, void *v) |
| @@ -4213,13 +4187,7 @@ static const struct seq_operations dev_seq_ops = { | |||
| 4213 | static int dev_seq_open(struct inode *inode, struct file *file) | 4187 | static int dev_seq_open(struct inode *inode, struct file *file) |
| 4214 | { | 4188 | { |
| 4215 | return seq_open_net(inode, file, &dev_seq_ops, | 4189 | return seq_open_net(inode, file, &dev_seq_ops, |
| 4216 | sizeof(struct dev_iter_state)); | 4190 | sizeof(struct seq_net_private)); |
| 4217 | } | ||
| 4218 | |||
| 4219 | int dev_seq_open_ops(struct inode *inode, struct file *file, | ||
| 4220 | const struct seq_operations *ops) | ||
| 4221 | { | ||
| 4222 | return seq_open_net(inode, file, ops, sizeof(struct dev_iter_state)); | ||
| 4223 | } | 4191 | } |
| 4224 | 4192 | ||
| 4225 | static const struct file_operations dev_seq_fops = { | 4193 | static const struct file_operations dev_seq_fops = { |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 29c07fef9228..626698f0db8b 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
| @@ -696,7 +696,8 @@ static const struct seq_operations dev_mc_seq_ops = { | |||
| 696 | 696 | ||
| 697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) | 697 | static int dev_mc_seq_open(struct inode *inode, struct file *file) |
| 698 | { | 698 | { |
| 699 | return dev_seq_open_ops(inode, file, &dev_mc_seq_ops); | 699 | return seq_open_net(inode, file, &dev_mc_seq_ops, |
| 700 | sizeof(struct seq_net_private)); | ||
| 700 | } | 701 | } |
| 701 | 702 | ||
| 702 | static const struct file_operations dev_mc_seq_fops = { | 703 | static const struct file_operations dev_mc_seq_fops = { |
diff --git a/net/core/filter.c b/net/core/filter.c index cf4989ac503b..6f755cca4520 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -39,8 +39,11 @@ | |||
| 39 | #include <linux/reciprocal_div.h> | 39 | #include <linux/reciprocal_div.h> |
| 40 | #include <linux/ratelimit.h> | 40 | #include <linux/ratelimit.h> |
| 41 | 41 | ||
| 42 | /* No hurry in this branch */ | 42 | /* No hurry in this branch |
| 43 | static void *__load_pointer(const struct sk_buff *skb, int k, unsigned int size) | 43 | * |
| 44 | * Exported for the bpf jit load helper. | ||
| 45 | */ | ||
| 46 | void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb, int k, unsigned int size) | ||
| 44 | { | 47 | { |
| 45 | u8 *ptr = NULL; | 48 | u8 *ptr = NULL; |
| 46 | 49 | ||
| @@ -59,7 +62,7 @@ static inline void *load_pointer(const struct sk_buff *skb, int k, | |||
| 59 | { | 62 | { |
| 60 | if (k >= 0) | 63 | if (k >= 0) |
| 61 | return skb_header_pointer(skb, k, size, buffer); | 64 | return skb_header_pointer(skb, k, size, buffer); |
| 62 | return __load_pointer(skb, k, size); | 65 | return bpf_internal_load_pointer_neg_helper(skb, k, size); |
| 63 | } | 66 | } |
| 64 | 67 | ||
| 65 | /** | 68 | /** |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f223cdc75da6..baf8d281152c 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3161,6 +3161,8 @@ static void sock_rmem_free(struct sk_buff *skb) | |||
| 3161 | */ | 3161 | */ |
| 3162 | int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | 3162 | int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) |
| 3163 | { | 3163 | { |
| 3164 | int len = skb->len; | ||
| 3165 | |||
| 3164 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 3166 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= |
| 3165 | (unsigned)sk->sk_rcvbuf) | 3167 | (unsigned)sk->sk_rcvbuf) |
| 3166 | return -ENOMEM; | 3168 | return -ENOMEM; |
| @@ -3175,7 +3177,7 @@ int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb) | |||
| 3175 | 3177 | ||
| 3176 | skb_queue_tail(&sk->sk_error_queue, skb); | 3178 | skb_queue_tail(&sk->sk_error_queue, skb); |
| 3177 | if (!sock_flag(sk, SOCK_DEAD)) | 3179 | if (!sock_flag(sk, SOCK_DEAD)) |
| 3178 | sk->sk_data_ready(sk, skb->len); | 3180 | sk->sk_data_ready(sk, len); |
| 3179 | return 0; | 3181 | return 0; |
| 3180 | } | 3182 | } |
| 3181 | EXPORT_SYMBOL(sock_queue_err_skb); | 3183 | EXPORT_SYMBOL(sock_queue_err_skb); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index cfd7edda0a8e..5d54ed30e821 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -860,7 +860,7 @@ wait_for_memory: | |||
| 860 | } | 860 | } |
| 861 | 861 | ||
| 862 | out: | 862 | out: |
| 863 | if (copied) | 863 | if (copied && !(flags & MSG_SENDPAGE_NOTLAST)) |
| 864 | tcp_push(sk, flags, mss_now, tp->nonagle); | 864 | tcp_push(sk, flags, mss_now, tp->nonagle); |
| 865 | return copied; | 865 | return copied; |
| 866 | 866 | ||
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 16c33e308121..b2869cab2092 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
| @@ -2044,7 +2044,7 @@ static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, | |||
| 2044 | if (!delta) | 2044 | if (!delta) |
| 2045 | pmc->mca_sfcount[sfmode]--; | 2045 | pmc->mca_sfcount[sfmode]--; |
| 2046 | for (j=0; j<i; j++) | 2046 | for (j=0; j<i; j++) |
| 2047 | (void) ip6_mc_del1_src(pmc, sfmode, &psfsrc[i]); | 2047 | ip6_mc_del1_src(pmc, sfmode, &psfsrc[j]); |
| 2048 | } else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) { | 2048 | } else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) { |
| 2049 | struct ip6_sf_list *psf; | 2049 | struct ip6_sf_list *psf; |
| 2050 | 2050 | ||
diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index cc5b7a6e7e0b..778e5916d7c3 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c | |||
| @@ -15,12 +15,6 @@ | |||
| 15 | #include "rate.h" | 15 | #include "rate.h" |
| 16 | #include "debugfs.h" | 16 | #include "debugfs.h" |
| 17 | 17 | ||
| 18 | int mac80211_open_file_generic(struct inode *inode, struct file *file) | ||
| 19 | { | ||
| 20 | file->private_data = inode->i_private; | ||
| 21 | return 0; | ||
| 22 | } | ||
| 23 | |||
| 24 | #define DEBUGFS_FORMAT_BUFFER_SIZE 100 | 18 | #define DEBUGFS_FORMAT_BUFFER_SIZE 100 |
| 25 | 19 | ||
| 26 | int mac80211_format_buffer(char __user *userbuf, size_t count, | 20 | int mac80211_format_buffer(char __user *userbuf, size_t count, |
| @@ -50,7 +44,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
| 50 | #define DEBUGFS_READONLY_FILE_OPS(name) \ | 44 | #define DEBUGFS_READONLY_FILE_OPS(name) \ |
| 51 | static const struct file_operations name## _ops = { \ | 45 | static const struct file_operations name## _ops = { \ |
| 52 | .read = name## _read, \ | 46 | .read = name## _read, \ |
| 53 | .open = mac80211_open_file_generic, \ | 47 | .open = simple_open, \ |
| 54 | .llseek = generic_file_llseek, \ | 48 | .llseek = generic_file_llseek, \ |
| 55 | }; | 49 | }; |
| 56 | 50 | ||
| @@ -93,7 +87,7 @@ static ssize_t reset_write(struct file *file, const char __user *user_buf, | |||
| 93 | 87 | ||
| 94 | static const struct file_operations reset_ops = { | 88 | static const struct file_operations reset_ops = { |
| 95 | .write = reset_write, | 89 | .write = reset_write, |
| 96 | .open = mac80211_open_file_generic, | 90 | .open = simple_open, |
| 97 | .llseek = noop_llseek, | 91 | .llseek = noop_llseek, |
| 98 | }; | 92 | }; |
| 99 | 93 | ||
| @@ -254,7 +248,7 @@ static ssize_t stats_ ##name## _read(struct file *file, \ | |||
| 254 | \ | 248 | \ |
| 255 | static const struct file_operations stats_ ##name## _ops = { \ | 249 | static const struct file_operations stats_ ##name## _ops = { \ |
| 256 | .read = stats_ ##name## _read, \ | 250 | .read = stats_ ##name## _read, \ |
| 257 | .open = mac80211_open_file_generic, \ | 251 | .open = simple_open, \ |
| 258 | .llseek = generic_file_llseek, \ | 252 | .llseek = generic_file_llseek, \ |
| 259 | }; | 253 | }; |
| 260 | 254 | ||
diff --git a/net/mac80211/debugfs.h b/net/mac80211/debugfs.h index 7c87529630f5..9be4e6d71d00 100644 --- a/net/mac80211/debugfs.h +++ b/net/mac80211/debugfs.h | |||
| @@ -3,7 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | #ifdef CONFIG_MAC80211_DEBUGFS | 4 | #ifdef CONFIG_MAC80211_DEBUGFS |
| 5 | extern void debugfs_hw_add(struct ieee80211_local *local); | 5 | extern void debugfs_hw_add(struct ieee80211_local *local); |
| 6 | extern int mac80211_open_file_generic(struct inode *inode, struct file *file); | ||
| 7 | extern int mac80211_format_buffer(char __user *userbuf, size_t count, | 6 | extern int mac80211_format_buffer(char __user *userbuf, size_t count, |
| 8 | loff_t *ppos, char *fmt, ...); | 7 | loff_t *ppos, char *fmt, ...); |
| 9 | #else | 8 | #else |
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 59edcd95a58d..7932767bb482 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c | |||
| @@ -30,7 +30,7 @@ static ssize_t key_##name##_read(struct file *file, \ | |||
| 30 | #define KEY_OPS(name) \ | 30 | #define KEY_OPS(name) \ |
| 31 | static const struct file_operations key_ ##name## _ops = { \ | 31 | static const struct file_operations key_ ##name## _ops = { \ |
| 32 | .read = key_##name##_read, \ | 32 | .read = key_##name##_read, \ |
| 33 | .open = mac80211_open_file_generic, \ | 33 | .open = simple_open, \ |
| 34 | .llseek = generic_file_llseek, \ | 34 | .llseek = generic_file_llseek, \ |
| 35 | } | 35 | } |
| 36 | 36 | ||
| @@ -45,7 +45,7 @@ static const struct file_operations key_ ##name## _ops = { \ | |||
| 45 | #define KEY_CONF_OPS(name) \ | 45 | #define KEY_CONF_OPS(name) \ |
| 46 | static const struct file_operations key_ ##name## _ops = { \ | 46 | static const struct file_operations key_ ##name## _ops = { \ |
| 47 | .read = key_conf_##name##_read, \ | 47 | .read = key_conf_##name##_read, \ |
| 48 | .open = mac80211_open_file_generic, \ | 48 | .open = simple_open, \ |
| 49 | .llseek = generic_file_llseek, \ | 49 | .llseek = generic_file_llseek, \ |
| 50 | } | 50 | } |
| 51 | 51 | ||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index a32eeda04aa3..30f99c344847 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
| @@ -135,7 +135,7 @@ static ssize_t ieee80211_if_read_##name(struct file *file, \ | |||
| 135 | static const struct file_operations name##_ops = { \ | 135 | static const struct file_operations name##_ops = { \ |
| 136 | .read = ieee80211_if_read_##name, \ | 136 | .read = ieee80211_if_read_##name, \ |
| 137 | .write = (_write), \ | 137 | .write = (_write), \ |
| 138 | .open = mac80211_open_file_generic, \ | 138 | .open = simple_open, \ |
| 139 | .llseek = generic_file_llseek, \ | 139 | .llseek = generic_file_llseek, \ |
| 140 | } | 140 | } |
| 141 | 141 | ||
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index 6d45804d09bc..832b2da5e4cd 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c | |||
| @@ -33,7 +33,7 @@ static ssize_t sta_ ##name## _read(struct file *file, \ | |||
| 33 | #define STA_OPS(name) \ | 33 | #define STA_OPS(name) \ |
| 34 | static const struct file_operations sta_ ##name## _ops = { \ | 34 | static const struct file_operations sta_ ##name## _ops = { \ |
| 35 | .read = sta_##name##_read, \ | 35 | .read = sta_##name##_read, \ |
| 36 | .open = mac80211_open_file_generic, \ | 36 | .open = simple_open, \ |
| 37 | .llseek = generic_file_llseek, \ | 37 | .llseek = generic_file_llseek, \ |
| 38 | } | 38 | } |
| 39 | 39 | ||
| @@ -41,7 +41,7 @@ static const struct file_operations sta_ ##name## _ops = { \ | |||
| 41 | static const struct file_operations sta_ ##name## _ops = { \ | 41 | static const struct file_operations sta_ ##name## _ops = { \ |
| 42 | .read = sta_##name##_read, \ | 42 | .read = sta_##name##_read, \ |
| 43 | .write = sta_##name##_write, \ | 43 | .write = sta_##name##_write, \ |
| 44 | .open = mac80211_open_file_generic, \ | 44 | .open = simple_open, \ |
| 45 | .llseek = generic_file_llseek, \ | 45 | .llseek = generic_file_llseek, \ |
| 46 | } | 46 | } |
| 47 | 47 | ||
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index b4f7600a3e36..3313c117b322 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
| @@ -145,7 +145,7 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf, | |||
| 145 | 145 | ||
| 146 | static const struct file_operations rcname_ops = { | 146 | static const struct file_operations rcname_ops = { |
| 147 | .read = rcname_read, | 147 | .read = rcname_read, |
| 148 | .open = mac80211_open_file_generic, | 148 | .open = simple_open, |
| 149 | .llseek = default_llseek, | 149 | .llseek = default_llseek, |
| 150 | }; | 150 | }; |
| 151 | #endif | 151 | #endif |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index cbdb754dbb10..3cc4487ac349 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -735,6 +735,7 @@ __nf_conntrack_alloc(struct net *net, u16 zone, | |||
| 735 | 735 | ||
| 736 | #ifdef CONFIG_NF_CONNTRACK_ZONES | 736 | #ifdef CONFIG_NF_CONNTRACK_ZONES |
| 737 | out_free: | 737 | out_free: |
| 738 | atomic_dec(&net->ct.count); | ||
| 738 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); | 739 | kmem_cache_free(net->ct.nf_conntrack_cachep, ct); |
| 739 | return ERR_PTR(-ENOMEM); | 740 | return ERR_PTR(-ENOMEM); |
| 740 | #endif | 741 | #endif |
diff --git a/net/netfilter/xt_CT.c b/net/netfilter/xt_CT.c index 0c8e43810ce3..59530e93fa58 100644 --- a/net/netfilter/xt_CT.c +++ b/net/netfilter/xt_CT.c | |||
| @@ -150,6 +150,17 @@ err1: | |||
| 150 | return ret; | 150 | return ret; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | ||
| 154 | static void __xt_ct_tg_timeout_put(struct ctnl_timeout *timeout) | ||
| 155 | { | ||
| 156 | typeof(nf_ct_timeout_put_hook) timeout_put; | ||
| 157 | |||
| 158 | timeout_put = rcu_dereference(nf_ct_timeout_put_hook); | ||
| 159 | if (timeout_put) | ||
| 160 | timeout_put(timeout); | ||
| 161 | } | ||
| 162 | #endif | ||
| 163 | |||
| 153 | static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | 164 | static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) |
| 154 | { | 165 | { |
| 155 | struct xt_ct_target_info_v1 *info = par->targinfo; | 166 | struct xt_ct_target_info_v1 *info = par->targinfo; |
| @@ -158,7 +169,9 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
| 158 | struct nf_conn *ct; | 169 | struct nf_conn *ct; |
| 159 | int ret = 0; | 170 | int ret = 0; |
| 160 | u8 proto; | 171 | u8 proto; |
| 161 | 172 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | |
| 173 | struct ctnl_timeout *timeout; | ||
| 174 | #endif | ||
| 162 | if (info->flags & ~XT_CT_NOTRACK) | 175 | if (info->flags & ~XT_CT_NOTRACK) |
| 163 | return -EINVAL; | 176 | return -EINVAL; |
| 164 | 177 | ||
| @@ -216,7 +229,6 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
| 216 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | 229 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT |
| 217 | if (info->timeout) { | 230 | if (info->timeout) { |
| 218 | typeof(nf_ct_timeout_find_get_hook) timeout_find_get; | 231 | typeof(nf_ct_timeout_find_get_hook) timeout_find_get; |
| 219 | struct ctnl_timeout *timeout; | ||
| 220 | struct nf_conn_timeout *timeout_ext; | 232 | struct nf_conn_timeout *timeout_ext; |
| 221 | 233 | ||
| 222 | rcu_read_lock(); | 234 | rcu_read_lock(); |
| @@ -245,7 +257,7 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
| 245 | pr_info("Timeout policy `%s' can only be " | 257 | pr_info("Timeout policy `%s' can only be " |
| 246 | "used by L3 protocol number %d\n", | 258 | "used by L3 protocol number %d\n", |
| 247 | info->timeout, timeout->l3num); | 259 | info->timeout, timeout->l3num); |
| 248 | goto err4; | 260 | goto err5; |
| 249 | } | 261 | } |
| 250 | /* Make sure the timeout policy matches any existing | 262 | /* Make sure the timeout policy matches any existing |
| 251 | * protocol tracker, otherwise default to generic. | 263 | * protocol tracker, otherwise default to generic. |
| @@ -258,13 +270,13 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | |||
| 258 | "used by L4 protocol number %d\n", | 270 | "used by L4 protocol number %d\n", |
| 259 | info->timeout, | 271 | info->timeout, |
| 260 | timeout->l4proto->l4proto); | 272 | timeout->l4proto->l4proto); |
| 261 | goto err4; | 273 | goto err5; |
| 262 | } | 274 | } |
| 263 | timeout_ext = nf_ct_timeout_ext_add(ct, timeout, | 275 | timeout_ext = nf_ct_timeout_ext_add(ct, timeout, |
| 264 | GFP_KERNEL); | 276 | GFP_ATOMIC); |
| 265 | if (timeout_ext == NULL) { | 277 | if (timeout_ext == NULL) { |
| 266 | ret = -ENOMEM; | 278 | ret = -ENOMEM; |
| 267 | goto err4; | 279 | goto err5; |
| 268 | } | 280 | } |
| 269 | } else { | 281 | } else { |
| 270 | ret = -ENOENT; | 282 | ret = -ENOENT; |
| @@ -281,8 +293,12 @@ out: | |||
| 281 | info->ct = ct; | 293 | info->ct = ct; |
| 282 | return 0; | 294 | return 0; |
| 283 | 295 | ||
| 296 | #ifdef CONFIG_NF_CONNTRACK_TIMEOUT | ||
| 297 | err5: | ||
| 298 | __xt_ct_tg_timeout_put(timeout); | ||
| 284 | err4: | 299 | err4: |
| 285 | rcu_read_unlock(); | 300 | rcu_read_unlock(); |
| 301 | #endif | ||
| 286 | err3: | 302 | err3: |
| 287 | nf_conntrack_free(ct); | 303 | nf_conntrack_free(ct); |
| 288 | err2: | 304 | err2: |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 32bb75324e76..faa48f70b7c9 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -829,12 +829,19 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, | |||
| 829 | return 0; | 829 | return 0; |
| 830 | } | 830 | } |
| 831 | 831 | ||
| 832 | int netlink_sendskb(struct sock *sk, struct sk_buff *skb) | 832 | static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb) |
| 833 | { | 833 | { |
| 834 | int len = skb->len; | 834 | int len = skb->len; |
| 835 | 835 | ||
| 836 | skb_queue_tail(&sk->sk_receive_queue, skb); | 836 | skb_queue_tail(&sk->sk_receive_queue, skb); |
| 837 | sk->sk_data_ready(sk, len); | 837 | sk->sk_data_ready(sk, len); |
| 838 | return len; | ||
| 839 | } | ||
| 840 | |||
| 841 | int netlink_sendskb(struct sock *sk, struct sk_buff *skb) | ||
| 842 | { | ||
| 843 | int len = __netlink_sendskb(sk, skb); | ||
| 844 | |||
| 838 | sock_put(sk); | 845 | sock_put(sk); |
| 839 | return len; | 846 | return len; |
| 840 | } | 847 | } |
| @@ -957,8 +964,7 @@ static int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb) | |||
| 957 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && | 964 | if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf && |
| 958 | !test_bit(0, &nlk->state)) { | 965 | !test_bit(0, &nlk->state)) { |
| 959 | skb_set_owner_r(skb, sk); | 966 | skb_set_owner_r(skb, sk); |
| 960 | skb_queue_tail(&sk->sk_receive_queue, skb); | 967 | __netlink_sendskb(sk, skb); |
| 961 | sk->sk_data_ready(sk, skb->len); | ||
| 962 | return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1); | 968 | return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1); |
| 963 | } | 969 | } |
| 964 | return -1; | 970 | return -1; |
| @@ -1698,10 +1704,8 @@ static int netlink_dump(struct sock *sk) | |||
| 1698 | 1704 | ||
| 1699 | if (sk_filter(sk, skb)) | 1705 | if (sk_filter(sk, skb)) |
| 1700 | kfree_skb(skb); | 1706 | kfree_skb(skb); |
| 1701 | else { | 1707 | else |
| 1702 | skb_queue_tail(&sk->sk_receive_queue, skb); | 1708 | __netlink_sendskb(sk, skb); |
| 1703 | sk->sk_data_ready(sk, skb->len); | ||
| 1704 | } | ||
| 1705 | return 0; | 1709 | return 0; |
| 1706 | } | 1710 | } |
| 1707 | 1711 | ||
| @@ -1715,10 +1719,8 @@ static int netlink_dump(struct sock *sk) | |||
| 1715 | 1719 | ||
| 1716 | if (sk_filter(sk, skb)) | 1720 | if (sk_filter(sk, skb)) |
| 1717 | kfree_skb(skb); | 1721 | kfree_skb(skb); |
| 1718 | else { | 1722 | else |
| 1719 | skb_queue_tail(&sk->sk_receive_queue, skb); | 1723 | __netlink_sendskb(sk, skb); |
| 1720 | sk->sk_data_ready(sk, skb->len); | ||
| 1721 | } | ||
| 1722 | 1724 | ||
| 1723 | if (cb->done) | 1725 | if (cb->done) |
| 1724 | cb->done(cb); | 1726 | cb->done(cb); |
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index 9f60008740e3..9726fe684ab8 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
| @@ -1130,6 +1130,9 @@ static int pep_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 1130 | int flags = msg->msg_flags; | 1130 | int flags = msg->msg_flags; |
| 1131 | int err, done; | 1131 | int err, done; |
| 1132 | 1132 | ||
| 1133 | if (len > USHRT_MAX) | ||
| 1134 | return -EMSGSIZE; | ||
| 1135 | |||
| 1133 | if ((msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL| | 1136 | if ((msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_NOSIGNAL| |
| 1134 | MSG_CMSG_COMPAT)) || | 1137 | MSG_CMSG_COMPAT)) || |
| 1135 | !(msg->msg_flags & MSG_EOR)) | 1138 | !(msg->msg_flags & MSG_EOR)) |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 06b42b7f5a02..92ba71dfe080 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -4133,9 +4133,10 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, | |||
| 4133 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, | 4133 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, |
| 4134 | int __user *optlen) | 4134 | int __user *optlen) |
| 4135 | { | 4135 | { |
| 4136 | if (len < sizeof(struct sctp_event_subscribe)) | 4136 | if (len <= 0) |
| 4137 | return -EINVAL; | 4137 | return -EINVAL; |
| 4138 | len = sizeof(struct sctp_event_subscribe); | 4138 | if (len > sizeof(struct sctp_event_subscribe)) |
| 4139 | len = sizeof(struct sctp_event_subscribe); | ||
| 4139 | if (put_user(len, optlen)) | 4140 | if (put_user(len, optlen)) |
| 4140 | return -EFAULT; | 4141 | return -EFAULT; |
| 4141 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) | 4142 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) |
diff --git a/net/socket.c b/net/socket.c index 484cc6953fc6..851edcd6b098 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -811,9 +811,9 @@ static ssize_t sock_sendpage(struct file *file, struct page *page, | |||
| 811 | 811 | ||
| 812 | sock = file->private_data; | 812 | sock = file->private_data; |
| 813 | 813 | ||
| 814 | flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT; | 814 | flags = (file->f_flags & O_NONBLOCK) ? MSG_DONTWAIT : 0; |
| 815 | if (more) | 815 | /* more is a combination of MSG_MORE and MSG_SENDPAGE_NOTLAST */ |
| 816 | flags |= MSG_MORE; | 816 | flags |= more; |
| 817 | 817 | ||
| 818 | return kernel_sendpage(sock, page, offset, size, flags); | 818 | return kernel_sendpage(sock, page, offset, size, flags); |
| 819 | } | 819 | } |
diff --git a/net/wireless/debugfs.c b/net/wireless/debugfs.c index 39765bcfb472..920cabe0461b 100644 --- a/net/wireless/debugfs.c +++ b/net/wireless/debugfs.c | |||
| @@ -13,12 +13,6 @@ | |||
| 13 | #include "core.h" | 13 | #include "core.h" |
| 14 | #include "debugfs.h" | 14 | #include "debugfs.h" |
| 15 | 15 | ||
| 16 | static int cfg80211_open_file_generic(struct inode *inode, struct file *file) | ||
| 17 | { | ||
| 18 | file->private_data = inode->i_private; | ||
| 19 | return 0; | ||
| 20 | } | ||
| 21 | |||
| 22 | #define DEBUGFS_READONLY_FILE(name, buflen, fmt, value...) \ | 16 | #define DEBUGFS_READONLY_FILE(name, buflen, fmt, value...) \ |
| 23 | static ssize_t name## _read(struct file *file, char __user *userbuf, \ | 17 | static ssize_t name## _read(struct file *file, char __user *userbuf, \ |
| 24 | size_t count, loff_t *ppos) \ | 18 | size_t count, loff_t *ppos) \ |
| @@ -33,7 +27,7 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ | |||
| 33 | \ | 27 | \ |
| 34 | static const struct file_operations name## _ops = { \ | 28 | static const struct file_operations name## _ops = { \ |
| 35 | .read = name## _read, \ | 29 | .read = name## _read, \ |
| 36 | .open = cfg80211_open_file_generic, \ | 30 | .open = simple_open, \ |
| 37 | .llseek = generic_file_llseek, \ | 31 | .llseek = generic_file_llseek, \ |
| 38 | }; | 32 | }; |
| 39 | 33 | ||
| @@ -102,7 +96,7 @@ static ssize_t ht40allow_map_read(struct file *file, | |||
| 102 | 96 | ||
| 103 | static const struct file_operations ht40allow_map_ops = { | 97 | static const struct file_operations ht40allow_map_ops = { |
| 104 | .read = ht40allow_map_read, | 98 | .read = ht40allow_map_read, |
| 105 | .open = cfg80211_open_file_generic, | 99 | .open = simple_open, |
| 106 | .llseek = default_llseek, | 100 | .llseek = default_llseek, |
| 107 | }; | 101 | }; |
| 108 | 102 | ||
diff --git a/scripts/coccinelle/api/simple_open.cocci b/scripts/coccinelle/api/simple_open.cocci new file mode 100644 index 000000000000..05962f7be155 --- /dev/null +++ b/scripts/coccinelle/api/simple_open.cocci | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | /// This removes an open coded simple_open() function | ||
| 2 | /// and replaces file operations references to the function | ||
| 3 | /// with simple_open() instead. | ||
| 4 | /// | ||
| 5 | // Confidence: High | ||
| 6 | // Comments: | ||
| 7 | // Options: -no_includes -include_headers | ||
| 8 | |||
| 9 | virtual patch | ||
| 10 | virtual report | ||
| 11 | |||
| 12 | @ open depends on patch @ | ||
| 13 | identifier open_f != simple_open; | ||
| 14 | identifier i, f; | ||
| 15 | @@ | ||
| 16 | -int open_f(struct inode *i, struct file *f) | ||
| 17 | -{ | ||
| 18 | ( | ||
| 19 | -if (i->i_private) | ||
| 20 | -f->private_data = i->i_private; | ||
| 21 | | | ||
| 22 | -f->private_data = i->i_private; | ||
| 23 | ) | ||
| 24 | -return 0; | ||
| 25 | -} | ||
| 26 | |||
| 27 | @ has_open depends on open @ | ||
| 28 | identifier fops; | ||
| 29 | identifier open.open_f; | ||
| 30 | @@ | ||
| 31 | struct file_operations fops = { | ||
| 32 | ..., | ||
| 33 | -.open = open_f, | ||
| 34 | +.open = simple_open, | ||
| 35 | ... | ||
| 36 | }; | ||
| 37 | |||
| 38 | @ openr depends on report @ | ||
| 39 | identifier open_f != simple_open; | ||
| 40 | identifier i, f; | ||
| 41 | position p; | ||
| 42 | @@ | ||
| 43 | int open_f@p(struct inode *i, struct file *f) | ||
| 44 | { | ||
| 45 | ( | ||
| 46 | if (i->i_private) | ||
| 47 | f->private_data = i->i_private; | ||
| 48 | | | ||
| 49 | f->private_data = i->i_private; | ||
| 50 | ) | ||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | |||
| 54 | @ has_openr depends on openr @ | ||
| 55 | identifier fops; | ||
| 56 | identifier openr.open_f; | ||
| 57 | position p; | ||
| 58 | @@ | ||
| 59 | struct file_operations fops = { | ||
| 60 | ..., | ||
| 61 | .open = open_f@p, | ||
| 62 | ... | ||
| 63 | }; | ||
| 64 | |||
| 65 | @script:python@ | ||
| 66 | pf << openr.p; | ||
| 67 | ps << has_openr.p; | ||
| 68 | @@ | ||
| 69 | |||
| 70 | coccilib.report.print_report(pf[0],"WARNING opportunity for simple_open, see also structure on line %s"%(ps[0].line)) | ||
diff --git a/sound/soc/imx/imx-audmux.c b/sound/soc/imx/imx-audmux.c index 601df809a26a..1765a197acb0 100644 --- a/sound/soc/imx/imx-audmux.c +++ b/sound/soc/imx/imx-audmux.c | |||
| @@ -40,12 +40,6 @@ static void __iomem *audmux_base; | |||
| 40 | #ifdef CONFIG_DEBUG_FS | 40 | #ifdef CONFIG_DEBUG_FS |
| 41 | static struct dentry *audmux_debugfs_root; | 41 | static struct dentry *audmux_debugfs_root; |
| 42 | 42 | ||
| 43 | static int audmux_open_file(struct inode *inode, struct file *file) | ||
| 44 | { | ||
| 45 | file->private_data = inode->i_private; | ||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | /* There is an annoying discontinuity in the SSI numbering with regard | 43 | /* There is an annoying discontinuity in the SSI numbering with regard |
| 50 | * to the Linux number of the devices */ | 44 | * to the Linux number of the devices */ |
| 51 | static const char *audmux_port_string(int port) | 45 | static const char *audmux_port_string(int port) |
| @@ -142,7 +136,7 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, | |||
| 142 | } | 136 | } |
| 143 | 137 | ||
| 144 | static const struct file_operations audmux_debugfs_fops = { | 138 | static const struct file_operations audmux_debugfs_fops = { |
| 145 | .open = audmux_open_file, | 139 | .open = simple_open, |
| 146 | .read = audmux_read_file, | 140 | .read = audmux_read_file, |
| 147 | .llseek = default_llseek, | 141 | .llseek = default_llseek, |
| 148 | }; | 142 | }; |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index a4deebc0801a..e19c24ade414 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -201,12 +201,6 @@ static ssize_t pmdown_time_set(struct device *dev, | |||
| 201 | static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set); | 201 | static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set); |
| 202 | 202 | ||
| 203 | #ifdef CONFIG_DEBUG_FS | 203 | #ifdef CONFIG_DEBUG_FS |
| 204 | static int codec_reg_open_file(struct inode *inode, struct file *file) | ||
| 205 | { | ||
| 206 | file->private_data = inode->i_private; | ||
| 207 | return 0; | ||
| 208 | } | ||
| 209 | |||
| 210 | static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf, | 204 | static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf, |
| 211 | size_t count, loff_t *ppos) | 205 | size_t count, loff_t *ppos) |
| 212 | { | 206 | { |
| @@ -264,7 +258,7 @@ static ssize_t codec_reg_write_file(struct file *file, | |||
| 264 | } | 258 | } |
| 265 | 259 | ||
| 266 | static const struct file_operations codec_reg_fops = { | 260 | static const struct file_operations codec_reg_fops = { |
| 267 | .open = codec_reg_open_file, | 261 | .open = simple_open, |
| 268 | .read = codec_reg_read_file, | 262 | .read = codec_reg_read_file, |
| 269 | .write = codec_reg_write_file, | 263 | .write = codec_reg_write_file, |
| 270 | .llseek = default_llseek, | 264 | .llseek = default_llseek, |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 6241490fff30..5cbd2d7623b8 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -1544,12 +1544,6 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event) | |||
| 1544 | } | 1544 | } |
| 1545 | 1545 | ||
| 1546 | #ifdef CONFIG_DEBUG_FS | 1546 | #ifdef CONFIG_DEBUG_FS |
| 1547 | static int dapm_widget_power_open_file(struct inode *inode, struct file *file) | ||
| 1548 | { | ||
| 1549 | file->private_data = inode->i_private; | ||
| 1550 | return 0; | ||
| 1551 | } | ||
| 1552 | |||
| 1553 | static ssize_t dapm_widget_power_read_file(struct file *file, | 1547 | static ssize_t dapm_widget_power_read_file(struct file *file, |
| 1554 | char __user *user_buf, | 1548 | char __user *user_buf, |
| 1555 | size_t count, loff_t *ppos) | 1549 | size_t count, loff_t *ppos) |
| @@ -1613,17 +1607,11 @@ static ssize_t dapm_widget_power_read_file(struct file *file, | |||
| 1613 | } | 1607 | } |
| 1614 | 1608 | ||
| 1615 | static const struct file_operations dapm_widget_power_fops = { | 1609 | static const struct file_operations dapm_widget_power_fops = { |
| 1616 | .open = dapm_widget_power_open_file, | 1610 | .open = simple_open, |
| 1617 | .read = dapm_widget_power_read_file, | 1611 | .read = dapm_widget_power_read_file, |
| 1618 | .llseek = default_llseek, | 1612 | .llseek = default_llseek, |
| 1619 | }; | 1613 | }; |
| 1620 | 1614 | ||
| 1621 | static int dapm_bias_open_file(struct inode *inode, struct file *file) | ||
| 1622 | { | ||
| 1623 | file->private_data = inode->i_private; | ||
| 1624 | return 0; | ||
| 1625 | } | ||
| 1626 | |||
| 1627 | static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, | 1615 | static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, |
| 1628 | size_t count, loff_t *ppos) | 1616 | size_t count, loff_t *ppos) |
| 1629 | { | 1617 | { |
| @@ -1654,7 +1642,7 @@ static ssize_t dapm_bias_read_file(struct file *file, char __user *user_buf, | |||
| 1654 | } | 1642 | } |
| 1655 | 1643 | ||
| 1656 | static const struct file_operations dapm_bias_fops = { | 1644 | static const struct file_operations dapm_bias_fops = { |
| 1657 | .open = dapm_bias_open_file, | 1645 | .open = simple_open, |
| 1658 | .read = dapm_bias_read_file, | 1646 | .read = dapm_bias_read_file, |
| 1659 | .llseek = default_llseek, | 1647 | .llseek = default_llseek, |
| 1660 | }; | 1648 | }; |
