mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
TTY/Serial driver changes for 6.6-rc1
Here is the big set of tty and serial driver changes for 6.6-rc1. Lots of cleanups in here this cycle, and some driver updates. Short summary is: - Jiri's continued work to make the tty code and apis be a bit more sane with regards to modern kernel coding style and types - cpm_uart driver updates - n_gsm updates and fixes - meson driver updates - sc16is7xx driver updates - 8250 driver updates for different hardware types - qcom-geni driver fixes - tegra serial driver change - stm32 driver updates - synclink_gt driver cleanups - tty structure size reduction All of these have been in linux-next this week with no reported issues. The last bit of cleanups from Jiri and the tty structure size reduction came in last week, a bit late but as they were just style changes and size reductions, I figured they should get into this merge cycle so that others can work on top of them with no merge conflicts. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZPH+jA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ykKyACgldt6QeenTN+6dXIHS/eQHtTKZwMAn3arSeXI QrUUnLFjOWyoX87tbMBQ =LVw0 -----END PGP SIGNATURE----- Merge tag 'tty-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial driver updates from Greg KH: "Here is the big set of tty and serial driver changes for 6.6-rc1. Lots of cleanups in here this cycle, and some driver updates. Short summary is: - Jiri's continued work to make the tty code and apis be a bit more sane with regards to modern kernel coding style and types - cpm_uart driver updates - n_gsm updates and fixes - meson driver updates - sc16is7xx driver updates - 8250 driver updates for different hardware types - qcom-geni driver fixes - tegra serial driver change - stm32 driver updates - synclink_gt driver cleanups - tty structure size reduction All of these have been in linux-next this week with no reported issues. The last bit of cleanups from Jiri and the tty structure size reduction came in last week, a bit late but as they were just style changes and size reductions, I figured they should get into this merge cycle so that others can work on top of them with no merge conflicts" * tag 'tty-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (199 commits) tty: shrink the size of struct tty_struct by 40 bytes tty: n_tty: deduplicate copy code in n_tty_receive_buf_real_raw() tty: n_tty: extract ECHO_OP processing to a separate function tty: n_tty: unify counts to size_t tty: n_tty: use u8 for chars and flags tty: n_tty: simplify chars_in_buffer() tty: n_tty: remove unsigned char casts from character constants tty: n_tty: move newline handling to a separate function tty: n_tty: move canon handling to a separate function tty: n_tty: use MASK() for masking out size bits tty: n_tty: make n_tty_data::num_overrun unsigned tty: n_tty: use time_is_before_jiffies() in n_tty_receive_overrun() tty: n_tty: use 'num' for writes' counts tty: n_tty: use output character directly tty: n_tty: make flow of n_tty_receive_buf_common() a bool Revert "tty: serial: meson: Add a earlycon for the T7 SoC" Documentation: devices.txt: Fix minors for ttyCPM* Documentation: devices.txt: Remove ttySIOC* Documentation: devices.txt: Remove ttyIOC* serial: 8250_bcm7271: improve bcm7271 8250 port ...
This commit is contained in:
commit
8e1e49550d
@ -2691,18 +2691,9 @@
|
|||||||
45 = /dev/ttyMM1 Marvell MPSC - port 1 (obsolete unused)
|
45 = /dev/ttyMM1 Marvell MPSC - port 1 (obsolete unused)
|
||||||
46 = /dev/ttyCPM0 PPC CPM (SCC or SMC) - port 0
|
46 = /dev/ttyCPM0 PPC CPM (SCC or SMC) - port 0
|
||||||
...
|
...
|
||||||
49 = /dev/ttyCPM5 PPC CPM (SCC or SMC) - port 3
|
51 = /dev/ttyCPM5 PPC CPM (SCC or SMC) - port 5
|
||||||
50 = /dev/ttyIOC0 Altix serial card
|
|
||||||
...
|
|
||||||
81 = /dev/ttyIOC31 Altix serial card
|
|
||||||
82 = /dev/ttyVR0 NEC VR4100 series SIU
|
82 = /dev/ttyVR0 NEC VR4100 series SIU
|
||||||
83 = /dev/ttyVR1 NEC VR4100 series DSIU
|
83 = /dev/ttyVR1 NEC VR4100 series DSIU
|
||||||
84 = /dev/ttyIOC84 Altix ioc4 serial card
|
|
||||||
...
|
|
||||||
115 = /dev/ttyIOC115 Altix ioc4 serial card
|
|
||||||
116 = /dev/ttySIOC0 Altix ioc3 serial card
|
|
||||||
...
|
|
||||||
147 = /dev/ttySIOC31 Altix ioc3 serial card
|
|
||||||
148 = /dev/ttyPSC0 PPC PSC - port 0
|
148 = /dev/ttyPSC0 PPC PSC - port 0
|
||||||
...
|
...
|
||||||
153 = /dev/ttyPSC5 PPC PSC - port 5
|
153 = /dev/ttyPSC5 PPC PSC - port 5
|
||||||
@ -2761,10 +2752,7 @@
|
|||||||
43 = /dev/ttycusmx2 Callout device for ttySMX2
|
43 = /dev/ttycusmx2 Callout device for ttySMX2
|
||||||
46 = /dev/cucpm0 Callout device for ttyCPM0
|
46 = /dev/cucpm0 Callout device for ttyCPM0
|
||||||
...
|
...
|
||||||
49 = /dev/cucpm5 Callout device for ttyCPM5
|
51 = /dev/cucpm5 Callout device for ttyCPM5
|
||||||
50 = /dev/cuioc40 Callout device for ttyIOC40
|
|
||||||
...
|
|
||||||
81 = /dev/cuioc431 Callout device for ttyIOC431
|
|
||||||
82 = /dev/cuvr0 Callout device for ttyVR0
|
82 = /dev/cuvr0 Callout device for ttyVR0
|
||||||
83 = /dev/cuvr1 Callout device for ttyVR1
|
83 = /dev/cuvr1 Callout device for ttyVR1
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ properties:
|
|||||||
- amlogic,meson8b-uart
|
- amlogic,meson8b-uart
|
||||||
- amlogic,meson-gx-uart
|
- amlogic,meson-gx-uart
|
||||||
- amlogic,meson-s4-uart
|
- amlogic,meson-s4-uart
|
||||||
|
- amlogic,meson-a1-uart
|
||||||
- const: amlogic,meson-ao-uart
|
- const: amlogic,meson-ao-uart
|
||||||
- description: Always-on power domain UART controller on G12A SoCs
|
- description: Always-on power domain UART controller on G12A SoCs
|
||||||
items:
|
items:
|
||||||
@ -46,10 +47,15 @@ properties:
|
|||||||
- amlogic,meson8b-uart
|
- amlogic,meson8b-uart
|
||||||
- amlogic,meson-gx-uart
|
- amlogic,meson-gx-uart
|
||||||
- amlogic,meson-s4-uart
|
- amlogic,meson-s4-uart
|
||||||
|
- amlogic,meson-a1-uart
|
||||||
- description: Everything-Else power domain UART controller on G12A SoCs
|
- description: Everything-Else power domain UART controller on G12A SoCs
|
||||||
items:
|
items:
|
||||||
- const: amlogic,meson-g12a-uart
|
- const: amlogic,meson-g12a-uart
|
||||||
- const: amlogic,meson-gx-uart
|
- const: amlogic,meson-gx-uart
|
||||||
|
- description: UART controller on S4 compatible SoCs
|
||||||
|
items:
|
||||||
|
- const: amlogic,t7-uart
|
||||||
|
- const: amlogic,meson-s4-uart
|
||||||
|
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
@ -25,9 +25,13 @@ properties:
|
|||||||
- fsl,imxrt1050-lpuart
|
- fsl,imxrt1050-lpuart
|
||||||
- items:
|
- items:
|
||||||
- enum:
|
- enum:
|
||||||
- fsl,imx93-lpuart
|
|
||||||
- fsl,imx8ulp-lpuart
|
- fsl,imx8ulp-lpuart
|
||||||
- const: fsl,imx7ulp-lpuart
|
- const: fsl,imx7ulp-lpuart
|
||||||
|
- items:
|
||||||
|
- enum:
|
||||||
|
- fsl,imx93-lpuart
|
||||||
|
- const: fsl,imx8ulp-lpuart
|
||||||
|
- const: fsl,imx7ulp-lpuart
|
||||||
- items:
|
- items:
|
||||||
- enum:
|
- enum:
|
||||||
- fsl,imx8qm-lpuart
|
- fsl,imx8qm-lpuart
|
||||||
|
@ -23,6 +23,9 @@ Optional properties:
|
|||||||
1 = active low.
|
1 = active low.
|
||||||
- irda-mode-ports: An array that lists the indices of the port that
|
- irda-mode-ports: An array that lists the indices of the port that
|
||||||
should operate in IrDA mode.
|
should operate in IrDA mode.
|
||||||
|
- nxp,modem-control-line-ports: An array that lists the indices of the port that
|
||||||
|
should have shared GPIO lines configured as
|
||||||
|
modem control lines.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
sc16is750: sc16is750@51 {
|
sc16is750: sc16is750@51 {
|
||||||
@ -35,6 +38,26 @@ Example:
|
|||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sc16is752: sc16is752@53 {
|
||||||
|
compatible = "nxp,sc16is752";
|
||||||
|
reg = <0x53>;
|
||||||
|
clocks = <&clk20m>;
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
nxp,modem-control-line-ports = <1>; /* Port 1 as modem control lines */
|
||||||
|
gpio-controller; /* Port 0 as GPIOs */
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sc16is752: sc16is752@54 {
|
||||||
|
compatible = "nxp,sc16is752";
|
||||||
|
reg = <0x54>;
|
||||||
|
clocks = <&clk20m>;
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
nxp,modem-control-line-ports = <0 1>; /* Ports 0 and 1 as modem control lines */
|
||||||
|
};
|
||||||
|
|
||||||
* spi as bus
|
* spi as bus
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
@ -59,6 +82,9 @@ Optional properties:
|
|||||||
1 = active low.
|
1 = active low.
|
||||||
- irda-mode-ports: An array that lists the indices of the port that
|
- irda-mode-ports: An array that lists the indices of the port that
|
||||||
should operate in IrDA mode.
|
should operate in IrDA mode.
|
||||||
|
- nxp,modem-control-line-ports: An array that lists the indices of the port that
|
||||||
|
should have shared GPIO lines configured as
|
||||||
|
modem control lines.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
sc16is750: sc16is750@0 {
|
sc16is750: sc16is750@0 {
|
||||||
@ -70,3 +96,23 @@ Example:
|
|||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sc16is752: sc16is752@1 {
|
||||||
|
compatible = "nxp,sc16is752";
|
||||||
|
reg = <1>;
|
||||||
|
clocks = <&clk20m>;
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
nxp,modem-control-line-ports = <1>; /* Port 1 as modem control lines */
|
||||||
|
gpio-controller; /* Port 0 as GPIOs */
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
sc16is752: sc16is752@2 {
|
||||||
|
compatible = "nxp,sc16is752";
|
||||||
|
reg = <2>;
|
||||||
|
clocks = <&clk20m>;
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
nxp,modem-control-line-ports = <0 1>; /* Ports 0 and 1 as modem control lines */
|
||||||
|
};
|
||||||
|
@ -117,7 +117,6 @@ properties:
|
|||||||
required:
|
required:
|
||||||
- compatible
|
- compatible
|
||||||
- reg
|
- reg
|
||||||
- interrupts
|
|
||||||
|
|
||||||
unevaluatedProperties: false
|
unevaluatedProperties: false
|
||||||
|
|
||||||
|
@ -15,10 +15,13 @@ Flip Buffer Management
|
|||||||
======================
|
======================
|
||||||
|
|
||||||
.. kernel-doc:: drivers/tty/tty_buffer.c
|
.. kernel-doc:: drivers/tty/tty_buffer.c
|
||||||
:identifiers: tty_prepare_flip_string tty_insert_flip_string_fixed_flag
|
:identifiers: tty_prepare_flip_string
|
||||||
tty_insert_flip_string_flags __tty_insert_flip_char
|
|
||||||
tty_flip_buffer_push tty_ldisc_receive_buf
|
tty_flip_buffer_push tty_ldisc_receive_buf
|
||||||
|
|
||||||
|
.. kernel-doc:: include/linux/tty_flip.h
|
||||||
|
:identifiers: tty_insert_flip_string_fixed_flag tty_insert_flip_string_flags
|
||||||
|
tty_insert_flip_char
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
Other Functions
|
Other Functions
|
||||||
|
@ -421,7 +421,7 @@ register_cpus(void)
|
|||||||
arch_initcall(register_cpus);
|
arch_initcall(register_cpus);
|
||||||
|
|
||||||
#ifdef CONFIG_MAGIC_SYSRQ
|
#ifdef CONFIG_MAGIC_SYSRQ
|
||||||
static void sysrq_reboot_handler(int unused)
|
static void sysrq_reboot_handler(u8 unused)
|
||||||
{
|
{
|
||||||
machine_halt();
|
machine_halt();
|
||||||
}
|
}
|
||||||
|
@ -129,9 +129,8 @@ srmcons_do_write(struct tty_port *port, const char *buf, int count)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static ssize_t
|
||||||
srmcons_write(struct tty_struct *tty,
|
srmcons_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
const unsigned char *buf, int count)
|
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
uart_AO: serial@1c00 {
|
uart_AO: serial@1c00 {
|
||||||
compatible = "amlogic,meson-gx-uart",
|
compatible = "amlogic,meson-a1-uart",
|
||||||
"amlogic,meson-ao-uart";
|
"amlogic,meson-ao-uart";
|
||||||
reg = <0x0 0x1c00 0x0 0x18>;
|
reg = <0x0 0x1c00 0x0 0x18>;
|
||||||
interrupts = <GIC_SPI 25 IRQ_TYPE_EDGE_RISING>;
|
interrupts = <GIC_SPI 25 IRQ_TYPE_EDGE_RISING>;
|
||||||
@ -118,7 +118,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
uart_AO_B: serial@2000 {
|
uart_AO_B: serial@2000 {
|
||||||
compatible = "amlogic,meson-gx-uart",
|
compatible = "amlogic,meson-a1-uart",
|
||||||
"amlogic,meson-ao-uart";
|
"amlogic,meson-ao-uart";
|
||||||
reg = <0x0 0x2000 0x0 0x18>;
|
reg = <0x0 0x2000 0x0 0x18>;
|
||||||
interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
|
interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
@ -43,7 +43,7 @@ static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
|
|||||||
static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
|
static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void sysrq_handle_tlbdump(int key)
|
static void sysrq_handle_tlbdump(u8 key)
|
||||||
{
|
{
|
||||||
sysrq_tlbdump_single(NULL);
|
sysrq_tlbdump_single(NULL);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -70,16 +70,16 @@ static void nfcon_tty_close(struct tty_struct *tty, struct file *filp)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nfcon_tty_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t nfcon_tty_write(struct tty_struct *tty, const u8 *buf,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
nfputs(buf, count);
|
nfputs(buf, count);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nfcon_tty_put_char(struct tty_struct *tty, unsigned char ch)
|
static int nfcon_tty_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
char temp[2] = { ch, 0 };
|
u8 temp[2] = { ch, 0 };
|
||||||
|
|
||||||
nf_call(stderr_id, virt_to_phys(temp));
|
nf_call(stderr_id, virt_to_phys(temp));
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -44,7 +44,7 @@ static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
|
|||||||
static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
|
static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void sysrq_handle_tlbdump(int key)
|
static void sysrq_handle_tlbdump(u8 key)
|
||||||
{
|
{
|
||||||
sysrq_tlbdump_single(NULL);
|
sysrq_tlbdump_single(NULL);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Platform information definitions.
|
|
||||||
*
|
|
||||||
* 2006 (c) MontaVista Software, Inc.
|
|
||||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
|
||||||
*
|
|
||||||
* This file is licensed under the terms of the GNU General Public License
|
|
||||||
* version 2. This program is licensed "as is" without any warranty of any
|
|
||||||
* kind, whether express or implied.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FS_PD_H
|
|
||||||
#define FS_PD_H
|
|
||||||
#include <sysdev/fsl_soc.h>
|
|
||||||
#include <asm/time.h>
|
|
||||||
|
|
||||||
static inline int uart_baudrate(void)
|
|
||||||
{
|
|
||||||
return get_baudrate();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int uart_clock(void)
|
|
||||||
{
|
|
||||||
return ppc_proc_freq;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -21,7 +21,6 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <linux/fs_uart_pd.h>
|
|
||||||
#include <linux/fsl_devices.h>
|
#include <linux/fsl_devices.h>
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <linux/fs_uart_pd.h>
|
|
||||||
#include <linux/fsl_devices.h>
|
#include <linux/fsl_devices.h>
|
||||||
#include <linux/mii.h>
|
#include <linux/mii.h>
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/fsl_devices.h>
|
#include <linux/fsl_devices.h>
|
||||||
#include <linux/fs_uart_pd.h>
|
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
@ -35,7 +34,6 @@
|
|||||||
#include <asm/cpm2.h>
|
#include <asm/cpm2.h>
|
||||||
#include <asm/fsl_hcalls.h> /* For the Freescale hypervisor */
|
#include <asm/fsl_hcalls.h> /* For the Freescale hypervisor */
|
||||||
|
|
||||||
extern void init_smc_ioports(struct fs_uart_platform_info*);
|
|
||||||
static phys_addr_t immrbase = -1;
|
static phys_addr_t immrbase = -1;
|
||||||
|
|
||||||
phys_addr_t get_immrbase(void)
|
phys_addr_t get_immrbase(void)
|
||||||
|
@ -3988,7 +3988,7 @@ static void xmon_init(int enable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MAGIC_SYSRQ
|
#ifdef CONFIG_MAGIC_SYSRQ
|
||||||
static void sysrq_handle_xmon(int key)
|
static void sysrq_handle_xmon(u8 key)
|
||||||
{
|
{
|
||||||
if (xmon_is_locked_down()) {
|
if (xmon_is_locked_down()) {
|
||||||
clear_all_bpt();
|
clear_all_bpt();
|
||||||
|
@ -284,7 +284,7 @@ struct vio_dring_state {
|
|||||||
struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES];
|
struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define VIO_TAG_SIZE ((int)sizeof(struct vio_msg_tag))
|
#define VIO_TAG_SIZE (sizeof(struct vio_msg_tag))
|
||||||
#define VIO_VCC_MTU_SIZE (LDC_PACKET_SIZE - VIO_TAG_SIZE)
|
#define VIO_VCC_MTU_SIZE (LDC_PACKET_SIZE - VIO_TAG_SIZE)
|
||||||
|
|
||||||
struct vio_vcc {
|
struct vio_vcc {
|
||||||
|
@ -295,7 +295,7 @@ void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu)
|
|||||||
|
|
||||||
#ifdef CONFIG_MAGIC_SYSRQ
|
#ifdef CONFIG_MAGIC_SYSRQ
|
||||||
|
|
||||||
static void sysrq_handle_globreg(int key)
|
static void sysrq_handle_globreg(u8 key)
|
||||||
{
|
{
|
||||||
trigger_all_cpu_backtrace();
|
trigger_all_cpu_backtrace();
|
||||||
}
|
}
|
||||||
@ -370,7 +370,7 @@ static void pmu_snapshot_all_cpus(void)
|
|||||||
spin_unlock_irqrestore(&global_cpu_snapshot_lock, flags);
|
spin_unlock_irqrestore(&global_cpu_snapshot_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysrq_handle_globpmu(int key)
|
static void sysrq_handle_globpmu(u8 key)
|
||||||
{
|
{
|
||||||
pmu_snapshot_all_cpus();
|
pmu_snapshot_all_cpus();
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ void line_flush_chars(struct tty_struct *tty)
|
|||||||
line_flush_buffer(tty);
|
line_flush_buffer(tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
int line_write(struct tty_struct *tty, const unsigned char *buf, int len)
|
ssize_t line_write(struct tty_struct *tty, const u8 *buf, size_t len)
|
||||||
{
|
{
|
||||||
struct line *line = tty->driver_data;
|
struct line *line = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -64,8 +64,7 @@ extern void line_cleanup(struct tty_struct *tty);
|
|||||||
extern void line_hangup(struct tty_struct *tty);
|
extern void line_hangup(struct tty_struct *tty);
|
||||||
extern int line_setup(char **conf, unsigned nlines, char **def,
|
extern int line_setup(char **conf, unsigned nlines, char **def,
|
||||||
char *init, char *name);
|
char *init, char *name);
|
||||||
extern int line_write(struct tty_struct *tty, const unsigned char *buf,
|
extern ssize_t line_write(struct tty_struct *tty, const u8 *buf, size_t len);
|
||||||
int len);
|
|
||||||
extern unsigned int line_chars_in_buffer(struct tty_struct *tty);
|
extern unsigned int line_chars_in_buffer(struct tty_struct *tty);
|
||||||
extern void line_flush_buffer(struct tty_struct *tty);
|
extern void line_flush_buffer(struct tty_struct *tty);
|
||||||
extern void line_flush_chars(struct tty_struct *tty);
|
extern void line_flush_chars(struct tty_struct *tty);
|
||||||
|
@ -52,8 +52,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int rs_write(struct tty_struct * tty,
|
static ssize_t rs_write(struct tty_struct * tty, const u8 *buf, size_t count)
|
||||||
const unsigned char *buf, int count)
|
|
||||||
{
|
{
|
||||||
/* see drivers/char/serialX.c to reference original version */
|
/* see drivers/char/serialX.c to reference original version */
|
||||||
|
|
||||||
@ -82,32 +81,12 @@ static void rs_poll(struct timer_list *unused)
|
|||||||
mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
|
mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int rs_put_char(struct tty_struct *tty, unsigned char ch)
|
|
||||||
{
|
|
||||||
return rs_write(tty, &ch, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rs_flush_chars(struct tty_struct *tty)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int rs_write_room(struct tty_struct *tty)
|
static unsigned int rs_write_room(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
/* Let's say iss can always accept 2K characters.. */
|
/* Let's say iss can always accept 2K characters.. */
|
||||||
return 2 * 1024;
|
return 2 * 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rs_hangup(struct tty_struct *tty)
|
|
||||||
{
|
|
||||||
/* Stub, once again.. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rs_wait_until_sent(struct tty_struct *tty, int timeout)
|
|
||||||
{
|
|
||||||
/* Stub, once again.. */
|
|
||||||
}
|
|
||||||
|
|
||||||
static int rs_proc_show(struct seq_file *m, void *v)
|
static int rs_proc_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
seq_printf(m, "serinfo:1.0 driver:0.1\n");
|
seq_printf(m, "serinfo:1.0 driver:0.1\n");
|
||||||
@ -118,11 +97,7 @@ static const struct tty_operations serial_ops = {
|
|||||||
.open = rs_open,
|
.open = rs_open,
|
||||||
.close = rs_close,
|
.close = rs_close,
|
||||||
.write = rs_write,
|
.write = rs_write,
|
||||||
.put_char = rs_put_char,
|
|
||||||
.flush_chars = rs_flush_chars,
|
|
||||||
.write_room = rs_write_room,
|
.write_room = rs_write_room,
|
||||||
.hangup = rs_hangup,
|
|
||||||
.wait_until_sent = rs_wait_until_sent,
|
|
||||||
.proc_show = rs_proc_show,
|
.proc_show = rs_proc_show,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -71,15 +71,14 @@ static void spk_ttyio_ldisc_close(struct tty_struct *tty)
|
|||||||
kfree(tty->disc_data);
|
kfree(tty->disc_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int spk_ttyio_receive_buf2(struct tty_struct *tty,
|
static size_t spk_ttyio_receive_buf2(struct tty_struct *tty, const u8 *cp,
|
||||||
const unsigned char *cp,
|
const u8 *fp, size_t count)
|
||||||
const char *fp, int count)
|
|
||||||
{
|
{
|
||||||
struct spk_ldisc_data *ldisc_data = tty->disc_data;
|
struct spk_ldisc_data *ldisc_data = tty->disc_data;
|
||||||
struct spk_synth *synth = ldisc_data->synth;
|
struct spk_synth *synth = ldisc_data->synth;
|
||||||
|
|
||||||
if (synth->read_buff_add) {
|
if (synth->read_buff_add) {
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
synth->read_buff_add(cp[i]);
|
synth->read_buff_add(cp[i]);
|
||||||
|
@ -599,7 +599,7 @@ static void hci_uart_tty_wakeup(struct tty_struct *tty)
|
|||||||
* Return Value: None
|
* Return Value: None
|
||||||
*/
|
*/
|
||||||
static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data,
|
static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data,
|
||||||
const char *flags, int count)
|
const u8 *flags, size_t count)
|
||||||
{
|
{
|
||||||
struct hci_uart *hu = tty->disc_data;
|
struct hci_uart *hu = tty->disc_data;
|
||||||
|
|
||||||
@ -807,20 +807,14 @@ static int hci_uart_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
|
|||||||
* We don't provide read/write/poll interface for user space.
|
* We don't provide read/write/poll interface for user space.
|
||||||
*/
|
*/
|
||||||
static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
|
static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file,
|
||||||
unsigned char *buf, size_t nr,
|
u8 *buf, size_t nr, void **cookie,
|
||||||
void **cookie, unsigned long offset)
|
unsigned long offset)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file,
|
static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file,
|
||||||
const unsigned char *data, size_t count)
|
const u8 *data, size_t count)
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __poll_t hci_uart_tty_poll(struct tty_struct *tty,
|
|
||||||
struct file *filp, poll_table *wait)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -835,7 +829,6 @@ static struct tty_ldisc_ops hci_uart_ldisc = {
|
|||||||
.write = hci_uart_tty_write,
|
.write = hci_uart_tty_write,
|
||||||
.ioctl = hci_uart_tty_ioctl,
|
.ioctl = hci_uart_tty_ioctl,
|
||||||
.compat_ioctl = hci_uart_tty_ioctl,
|
.compat_ioctl = hci_uart_tty_ioctl,
|
||||||
.poll = hci_uart_tty_poll,
|
|
||||||
.receive_buf = hci_uart_tty_receive,
|
.receive_buf = hci_uart_tty_receive,
|
||||||
.write_wakeup = hci_uart_tty_wakeup,
|
.write_wakeup = hci_uart_tty_wakeup,
|
||||||
};
|
};
|
||||||
|
@ -51,7 +51,7 @@ static void tpk_flush(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tpk_printk(const unsigned char *buf, int count)
|
static int tpk_printk(const u8 *buf, int count)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -103,8 +103,7 @@ static void tpk_close(struct tty_struct *tty, struct file *filp)
|
|||||||
/*
|
/*
|
||||||
* TTY operations write function.
|
* TTY operations write function.
|
||||||
*/
|
*/
|
||||||
static int tpk_write(struct tty_struct *tty,
|
static ssize_t tpk_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
const unsigned char *buf, int count)
|
|
||||||
{
|
{
|
||||||
struct ttyprintk_port *tpkp = tty->driver_data;
|
struct ttyprintk_port *tpkp = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -301,7 +301,7 @@ static void drm_fb_helper_restore_work_fn(struct work_struct *ignored)
|
|||||||
|
|
||||||
static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);
|
static DECLARE_WORK(drm_fb_helper_restore_work, drm_fb_helper_restore_work_fn);
|
||||||
|
|
||||||
static void drm_fb_helper_sysrq(int dummy1)
|
static void drm_fb_helper_sysrq(u8 dummy1)
|
||||||
{
|
{
|
||||||
schedule_work(&drm_fb_helper_restore_work);
|
schedule_work(&drm_fb_helper_restore_work);
|
||||||
}
|
}
|
||||||
|
@ -103,7 +103,7 @@ static int serport_ldisc_open(struct tty_struct *tty)
|
|||||||
|
|
||||||
static void serport_ldisc_close(struct tty_struct *tty)
|
static void serport_ldisc_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct serport *serport = (struct serport *) tty->disc_data;
|
struct serport *serport = tty->disc_data;
|
||||||
|
|
||||||
kfree(serport);
|
kfree(serport);
|
||||||
}
|
}
|
||||||
@ -114,10 +114,10 @@ static void serport_ldisc_close(struct tty_struct *tty)
|
|||||||
* 'interrupt' routine.
|
* 'interrupt' routine.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void serport_ldisc_receive(struct tty_struct *tty,
|
static void serport_ldisc_receive(struct tty_struct *tty, const u8 *cp,
|
||||||
const unsigned char *cp, const char *fp, int count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct serport *serport = (struct serport*) tty->disc_data;
|
struct serport *serport = tty->disc_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int ch_flags = 0;
|
unsigned int ch_flags = 0;
|
||||||
int i;
|
int i;
|
||||||
@ -158,10 +158,10 @@ out:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file,
|
static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file,
|
||||||
unsigned char *kbuf, size_t nr,
|
u8 *kbuf, size_t nr, void **cookie,
|
||||||
void **cookie, unsigned long offset)
|
unsigned long offset)
|
||||||
{
|
{
|
||||||
struct serport *serport = (struct serport*) tty->disc_data;
|
struct serport *serport = tty->disc_data;
|
||||||
struct serio *serio;
|
struct serio *serio;
|
||||||
|
|
||||||
if (test_and_set_bit(SERPORT_BUSY, &serport->flags))
|
if (test_and_set_bit(SERPORT_BUSY, &serport->flags))
|
||||||
@ -245,7 +245,7 @@ static int serport_ldisc_compat_ioctl(struct tty_struct *tty,
|
|||||||
|
|
||||||
static void serport_ldisc_hangup(struct tty_struct *tty)
|
static void serport_ldisc_hangup(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct serport *serport = (struct serport *) tty->disc_data;
|
struct serport *serport = tty->disc_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&serport->lock, flags);
|
spin_lock_irqsave(&serport->lock, flags);
|
||||||
@ -257,7 +257,7 @@ static void serport_ldisc_hangup(struct tty_struct *tty)
|
|||||||
|
|
||||||
static void serport_ldisc_write_wakeup(struct tty_struct * tty)
|
static void serport_ldisc_write_wakeup(struct tty_struct * tty)
|
||||||
{
|
{
|
||||||
struct serport *serport = (struct serport *) tty->disc_data;
|
struct serport *serport = tty->disc_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&serport->lock, flags);
|
spin_lock_irqsave(&serport->lock, flags);
|
||||||
|
@ -437,8 +437,7 @@ err_put_driver:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
|
static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
|
||||||
const unsigned char *buf,
|
const u8 *buf, int count)
|
||||||
int count)
|
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
@ -459,8 +458,8 @@ static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel,
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipoctal_write_tty(struct tty_struct *tty,
|
static ssize_t ipoctal_write_tty(struct tty_struct *tty, const u8 *buf,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct ipoctal_channel *channel = tty->driver_data;
|
struct ipoctal_channel *channel = tty->driver_data;
|
||||||
unsigned int char_copied;
|
unsigned int char_copied;
|
||||||
|
@ -1077,13 +1077,13 @@ static void capinc_tty_close(struct tty_struct *tty, struct file *filp)
|
|||||||
tty_port_close(&mp->port, tty, filp);
|
tty_port_close(&mp->port, tty, filp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int capinc_tty_write(struct tty_struct *tty,
|
static ssize_t capinc_tty_write(struct tty_struct *tty, const u8 *buf,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct capiminor *mp = tty->driver_data;
|
struct capiminor *mp = tty->driver_data;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
pr_debug("capinc_tty_write(count=%d)\n", count);
|
pr_debug("capinc_tty_write(count=%zu)\n", count);
|
||||||
|
|
||||||
spin_lock_bh(&mp->outlock);
|
spin_lock_bh(&mp->outlock);
|
||||||
skb = mp->outskb;
|
skb = mp->outskb;
|
||||||
@ -1112,7 +1112,7 @@ static int capinc_tty_write(struct tty_struct *tty,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
|
static int capinc_tty_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
struct capiminor *mp = tty->driver_data;
|
struct capiminor *mp = tty->driver_data;
|
||||||
bool invoke_send = false;
|
bool invoke_send = false;
|
||||||
|
@ -186,9 +186,8 @@ static void bcm_vk_tty_doorbell(struct bcm_vk *vk, u32 db_val)
|
|||||||
VK_BAR0_REGSEG_DB_BASE + VK_BAR0_REGSEG_TTY_DB_OFFSET);
|
VK_BAR0_REGSEG_DB_BASE + VK_BAR0_REGSEG_TTY_DB_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcm_vk_tty_write(struct tty_struct *tty,
|
static ssize_t bcm_vk_tty_write(struct tty_struct *tty, const u8 *buffer,
|
||||||
const unsigned char *buffer,
|
size_t count)
|
||||||
int count)
|
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
struct bcm_vk *vk;
|
struct bcm_vk *vk;
|
||||||
|
@ -16,14 +16,12 @@
|
|||||||
|
|
||||||
#include <linux/ti_wilink_st.h>
|
#include <linux/ti_wilink_st.h>
|
||||||
|
|
||||||
extern void st_kim_recv(void *, const unsigned char *, long);
|
|
||||||
void st_int_recv(void *, const unsigned char *, long);
|
|
||||||
/*
|
/*
|
||||||
* function pointer pointing to either,
|
* function pointer pointing to either,
|
||||||
* st_kim_recv during registration to receive fw download responses
|
* st_kim_recv during registration to receive fw download responses
|
||||||
* st_int_recv after registration to receive proto stack responses
|
* st_int_recv after registration to receive proto stack responses
|
||||||
*/
|
*/
|
||||||
static void (*st_recv) (void *, const unsigned char *, long);
|
static void (*st_recv)(void *disc_data, const u8 *ptr, size_t count);
|
||||||
|
|
||||||
/********************************************************************/
|
/********************************************************************/
|
||||||
static void add_channel_to_table(struct st_data_s *st_gdata,
|
static void add_channel_to_table(struct st_data_s *st_gdata,
|
||||||
@ -225,10 +223,8 @@ static inline void st_wakeup_ack(struct st_data_s *st_gdata,
|
|||||||
* HCI-Events, ACL, SCO, 4 types of HCI-LL PM packets
|
* HCI-Events, ACL, SCO, 4 types of HCI-LL PM packets
|
||||||
* CH-8 packets from FM, CH-9 packets from GPS cores.
|
* CH-8 packets from FM, CH-9 packets from GPS cores.
|
||||||
*/
|
*/
|
||||||
void st_int_recv(void *disc_data,
|
static void st_int_recv(void *disc_data, const u8 *ptr, size_t count)
|
||||||
const unsigned char *data, long count)
|
|
||||||
{
|
{
|
||||||
char *ptr;
|
|
||||||
struct st_proto_s *proto;
|
struct st_proto_s *proto;
|
||||||
unsigned short payload_len = 0;
|
unsigned short payload_len = 0;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
@ -237,14 +233,12 @@ void st_int_recv(void *disc_data,
|
|||||||
struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
|
struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
ptr = (char *)data;
|
if (st_gdata == NULL) {
|
||||||
/* tty_receive sent null ? */
|
|
||||||
if (unlikely(ptr == NULL) || (st_gdata == NULL)) {
|
|
||||||
pr_err(" received null from TTY ");
|
pr_err(" received null from TTY ");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("count %ld rx_state %ld"
|
pr_debug("count %zu rx_state %ld"
|
||||||
"rx_count %ld", count, st_gdata->rx_state,
|
"rx_count %ld", count, st_gdata->rx_state,
|
||||||
st_gdata->rx_count);
|
st_gdata->rx_count);
|
||||||
|
|
||||||
@ -796,8 +790,8 @@ static void st_tty_close(struct tty_struct *tty)
|
|||||||
pr_debug("%s: done ", __func__);
|
pr_debug("%s: done ", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void st_tty_receive(struct tty_struct *tty, const unsigned char *data,
|
static void st_tty_receive(struct tty_struct *tty, const u8 *data,
|
||||||
const char *tty_flags, int count)
|
const u8 *tty_flags, size_t count)
|
||||||
{
|
{
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
print_hex_dump(KERN_DEBUG, ">in>", DUMP_PREFIX_NONE,
|
print_hex_dump(KERN_DEBUG, ">in>", DUMP_PREFIX_NONE,
|
||||||
|
@ -127,21 +127,14 @@ static inline int kim_check_data_len(struct kim_data_s *kim_gdata, int len)
|
|||||||
* have been observed to come in bursts of different
|
* have been observed to come in bursts of different
|
||||||
* tty_receive and hence the logic
|
* tty_receive and hence the logic
|
||||||
*/
|
*/
|
||||||
static void kim_int_recv(struct kim_data_s *kim_gdata,
|
static void kim_int_recv(struct kim_data_s *kim_gdata, const u8 *ptr,
|
||||||
const unsigned char *data, long count)
|
size_t count)
|
||||||
{
|
{
|
||||||
const unsigned char *ptr;
|
|
||||||
int len = 0;
|
int len = 0;
|
||||||
unsigned char *plen;
|
unsigned char *plen;
|
||||||
|
|
||||||
pr_debug("%s", __func__);
|
pr_debug("%s", __func__);
|
||||||
/* Decode received bytes here */
|
/* Decode received bytes here */
|
||||||
ptr = data;
|
|
||||||
if (unlikely(ptr == NULL)) {
|
|
||||||
pr_err(" received null from TTY ");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
if (kim_gdata->rx_count) {
|
if (kim_gdata->rx_count) {
|
||||||
len = min_t(unsigned int, kim_gdata->rx_count, count);
|
len = min_t(unsigned int, kim_gdata->rx_count, count);
|
||||||
@ -424,7 +417,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)
|
|||||||
* 1. response to read local version
|
* 1. response to read local version
|
||||||
* 2. during send/recv's of firmware download
|
* 2. during send/recv's of firmware download
|
||||||
*/
|
*/
|
||||||
void st_kim_recv(void *disc_data, const unsigned char *data, long count)
|
void st_kim_recv(void *disc_data, const u8 *data, size_t count)
|
||||||
{
|
{
|
||||||
struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
|
struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
|
||||||
struct kim_data_s *kim_gdata = st_gdata->kim_data;
|
struct kim_data_s *kim_gdata = st_gdata->kim_data;
|
||||||
|
@ -760,8 +760,8 @@ static void sdio_uart_hangup(struct tty_struct *tty)
|
|||||||
tty_port_hangup(&port->port);
|
tty_port_hangup(&port->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sdio_uart_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t sdio_uart_write(struct tty_struct *tty, const u8 *buf,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct sdio_uart_port *port = tty->driver_data;
|
struct sdio_uart_port *port = tty->driver_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -159,7 +159,7 @@ static inline void debugfs_tx(struct ser_device *ser, const u8 *data, int size)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void ldisc_receive(struct tty_struct *tty, const u8 *data,
|
static void ldisc_receive(struct tty_struct *tty, const u8 *data,
|
||||||
const char *flags, int count)
|
const u8 *flags, size_t count)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
struct ser_device *ser;
|
struct ser_device *ser;
|
||||||
|
@ -885,10 +885,10 @@ static bool can327_is_valid_rx_char(u8 c)
|
|||||||
* This will not be re-entered while running, but other ldisc
|
* This will not be re-entered while running, but other ldisc
|
||||||
* functions may be called in parallel.
|
* functions may be called in parallel.
|
||||||
*/
|
*/
|
||||||
static void can327_ldisc_rx(struct tty_struct *tty, const unsigned char *cp,
|
static void can327_ldisc_rx(struct tty_struct *tty, const u8 *cp,
|
||||||
const char *fp, int count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct can327 *elm = (struct can327 *)tty->disc_data;
|
struct can327 *elm = tty->disc_data;
|
||||||
size_t first_new_char_idx;
|
size_t first_new_char_idx;
|
||||||
|
|
||||||
if (elm->uart_side_failure)
|
if (elm->uart_side_failure)
|
||||||
@ -901,15 +901,17 @@ static void can327_ldisc_rx(struct tty_struct *tty, const unsigned char *cp,
|
|||||||
*/
|
*/
|
||||||
first_new_char_idx = elm->rxfill;
|
first_new_char_idx = elm->rxfill;
|
||||||
|
|
||||||
while (count-- && elm->rxfill < CAN327_SIZE_RXBUF) {
|
while (count--) {
|
||||||
|
if (elm->rxfill >= CAN327_SIZE_RXBUF) {
|
||||||
|
netdev_err(elm->dev,
|
||||||
|
"Receive buffer overflowed. Bad chip or wiring? count = %zu",
|
||||||
|
count);
|
||||||
|
goto uart_failure;
|
||||||
|
}
|
||||||
if (fp && *fp++) {
|
if (fp && *fp++) {
|
||||||
netdev_err(elm->dev,
|
netdev_err(elm->dev,
|
||||||
"Error in received character stream. Check your wiring.");
|
"Error in received character stream. Check your wiring.");
|
||||||
|
goto uart_failure;
|
||||||
can327_uart_side_failure(elm);
|
|
||||||
|
|
||||||
spin_unlock_bh(&elm->lock);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ignore NUL characters, which the PIC microcontroller may
|
/* Ignore NUL characters, which the PIC microcontroller may
|
||||||
@ -925,10 +927,7 @@ static void can327_ldisc_rx(struct tty_struct *tty, const unsigned char *cp,
|
|||||||
netdev_err(elm->dev,
|
netdev_err(elm->dev,
|
||||||
"Received illegal character %02x.\n",
|
"Received illegal character %02x.\n",
|
||||||
*cp);
|
*cp);
|
||||||
can327_uart_side_failure(elm);
|
goto uart_failure;
|
||||||
|
|
||||||
spin_unlock_bh(&elm->lock);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
elm->rxbuf[elm->rxfill++] = *cp;
|
elm->rxbuf[elm->rxfill++] = *cp;
|
||||||
@ -937,19 +936,13 @@ static void can327_ldisc_rx(struct tty_struct *tty, const unsigned char *cp,
|
|||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count >= 0) {
|
|
||||||
netdev_err(elm->dev,
|
|
||||||
"Receive buffer overflowed. Bad chip or wiring? count = %i",
|
|
||||||
count);
|
|
||||||
|
|
||||||
can327_uart_side_failure(elm);
|
|
||||||
|
|
||||||
spin_unlock_bh(&elm->lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
can327_parse_rxbuf(elm, first_new_char_idx);
|
can327_parse_rxbuf(elm, first_new_char_idx);
|
||||||
spin_unlock_bh(&elm->lock);
|
spin_unlock_bh(&elm->lock);
|
||||||
|
|
||||||
|
return;
|
||||||
|
uart_failure:
|
||||||
|
can327_uart_side_failure(elm);
|
||||||
|
spin_unlock_bh(&elm->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write out remaining transmit buffer.
|
/* Write out remaining transmit buffer.
|
||||||
@ -990,7 +983,7 @@ static void can327_ldisc_tx_worker(struct work_struct *work)
|
|||||||
/* Called by the driver when there's room for more data. */
|
/* Called by the driver when there's room for more data. */
|
||||||
static void can327_ldisc_tx_wakeup(struct tty_struct *tty)
|
static void can327_ldisc_tx_wakeup(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct can327 *elm = (struct can327 *)tty->disc_data;
|
struct can327 *elm = tty->disc_data;
|
||||||
|
|
||||||
schedule_work(&elm->tx_work);
|
schedule_work(&elm->tx_work);
|
||||||
}
|
}
|
||||||
@ -1067,7 +1060,7 @@ static int can327_ldisc_open(struct tty_struct *tty)
|
|||||||
*/
|
*/
|
||||||
static void can327_ldisc_close(struct tty_struct *tty)
|
static void can327_ldisc_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct can327 *elm = (struct can327 *)tty->disc_data;
|
struct can327 *elm = tty->disc_data;
|
||||||
|
|
||||||
/* unregister_netdev() calls .ndo_stop() so we don't have to. */
|
/* unregister_netdev() calls .ndo_stop() so we don't have to. */
|
||||||
unregister_candev(elm->dev);
|
unregister_candev(elm->dev);
|
||||||
@ -1092,7 +1085,7 @@ static void can327_ldisc_close(struct tty_struct *tty)
|
|||||||
static int can327_ldisc_ioctl(struct tty_struct *tty, unsigned int cmd,
|
static int can327_ldisc_ioctl(struct tty_struct *tty, unsigned int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
struct can327 *elm = (struct can327 *)tty->disc_data;
|
struct can327 *elm = tty->disc_data;
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
@ -108,11 +108,6 @@ struct ems_pci_card {
|
|||||||
|
|
||||||
#define EMS_PCI_BASE_SIZE 4096 /* size of controller area */
|
#define EMS_PCI_BASE_SIZE 4096 /* size of controller area */
|
||||||
|
|
||||||
#ifndef PCI_VENDOR_ID_ASIX
|
|
||||||
#define PCI_VENDOR_ID_ASIX 0x125b
|
|
||||||
#define PCI_DEVICE_ID_ASIX_9110 0x9110
|
|
||||||
#define PCI_SUBVENDOR_ID_ASIX 0xa000
|
|
||||||
#endif
|
|
||||||
#define PCI_SUBDEVICE_ID_EMS 0x4010
|
#define PCI_SUBDEVICE_ID_EMS 0x4010
|
||||||
|
|
||||||
static const struct pci_device_id ems_pci_tbl[] = {
|
static const struct pci_device_id ems_pci_tbl[] = {
|
||||||
@ -123,7 +118,7 @@ static const struct pci_device_id ems_pci_tbl[] = {
|
|||||||
/* CPC-104P v2 */
|
/* CPC-104P v2 */
|
||||||
{PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_PLX, 0x4002},
|
{PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, PCI_VENDOR_ID_PLX, 0x4002},
|
||||||
/* CPC-PCIe v3 */
|
/* CPC-PCIe v3 */
|
||||||
{PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_9110, PCI_SUBVENDOR_ID_ASIX, PCI_SUBDEVICE_ID_EMS},
|
{PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100_LB, 0xa000, PCI_SUBDEVICE_ID_EMS},
|
||||||
{0,}
|
{0,}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, ems_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, ems_pci_tbl);
|
||||||
|
@ -583,7 +583,7 @@ static void slcan_transmit(struct work_struct *work)
|
|||||||
*/
|
*/
|
||||||
static void slcan_write_wakeup(struct tty_struct *tty)
|
static void slcan_write_wakeup(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct slcan *sl = (struct slcan *)tty->disc_data;
|
struct slcan *sl = tty->disc_data;
|
||||||
|
|
||||||
schedule_work(&sl->tx_work);
|
schedule_work(&sl->tx_work);
|
||||||
}
|
}
|
||||||
@ -774,11 +774,10 @@ static const struct net_device_ops slcan_netdev_ops = {
|
|||||||
* be re-entered while running but other ldisc functions may be called
|
* be re-entered while running but other ldisc functions may be called
|
||||||
* in parallel
|
* in parallel
|
||||||
*/
|
*/
|
||||||
static void slcan_receive_buf(struct tty_struct *tty,
|
static void slcan_receive_buf(struct tty_struct *tty, const u8 *cp,
|
||||||
const unsigned char *cp, const char *fp,
|
const u8 *fp, size_t count)
|
||||||
int count)
|
|
||||||
{
|
{
|
||||||
struct slcan *sl = (struct slcan *)tty->disc_data;
|
struct slcan *sl = tty->disc_data;
|
||||||
|
|
||||||
if (!netif_running(sl->dev))
|
if (!netif_running(sl->dev))
|
||||||
return;
|
return;
|
||||||
@ -862,7 +861,7 @@ static int slcan_open(struct tty_struct *tty)
|
|||||||
*/
|
*/
|
||||||
static void slcan_close(struct tty_struct *tty)
|
static void slcan_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct slcan *sl = (struct slcan *)tty->disc_data;
|
struct slcan *sl = tty->disc_data;
|
||||||
|
|
||||||
unregister_candev(sl->dev);
|
unregister_candev(sl->dev);
|
||||||
|
|
||||||
@ -886,7 +885,7 @@ static void slcan_close(struct tty_struct *tty)
|
|||||||
static int slcan_ioctl(struct tty_struct *tty, unsigned int cmd,
|
static int slcan_ioctl(struct tty_struct *tty, unsigned int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
struct slcan *sl = (struct slcan *)tty->disc_data;
|
struct slcan *sl = tty->disc_data;
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
@ -427,8 +427,8 @@ out:
|
|||||||
* a block of 6pack data has been received, which can now be decapsulated
|
* a block of 6pack data has been received, which can now be decapsulated
|
||||||
* and sent on to some IP layer for further processing.
|
* and sent on to some IP layer for further processing.
|
||||||
*/
|
*/
|
||||||
static void sixpack_receive_buf(struct tty_struct *tty,
|
static void sixpack_receive_buf(struct tty_struct *tty, const u8 *cp,
|
||||||
const unsigned char *cp, const char *fp, int count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct sixpack *sp;
|
struct sixpack *sp;
|
||||||
int count1;
|
int count1;
|
||||||
|
@ -874,8 +874,8 @@ static int mkiss_ioctl(struct tty_struct *tty, unsigned int cmd,
|
|||||||
* a block of data has been received, which can now be decapsulated
|
* a block of data has been received, which can now be decapsulated
|
||||||
* and sent on to the AX.25 layer for further processing.
|
* and sent on to the AX.25 layer for further processing.
|
||||||
*/
|
*/
|
||||||
static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp,
|
static void mkiss_receive_buf(struct tty_struct *tty, const u8 *cp,
|
||||||
const char *fp, int count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct mkiss *ax = mkiss_get(tty);
|
struct mkiss *ax = mkiss_get(tty);
|
||||||
|
|
||||||
|
@ -390,9 +390,8 @@ static void mctp_serial_push(struct mctp_serial *dev, unsigned char c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mctp_serial_tty_receive_buf(struct tty_struct *tty,
|
static void mctp_serial_tty_receive_buf(struct tty_struct *tty, const u8 *c,
|
||||||
const unsigned char *c,
|
const u8 *f, size_t len)
|
||||||
const char *f, int len)
|
|
||||||
{
|
{
|
||||||
struct mctp_serial *dev = tty->disc_data;
|
struct mctp_serial *dev = tty->disc_data;
|
||||||
int i;
|
int i;
|
||||||
|
@ -98,7 +98,7 @@ static int ppp_async_send(struct ppp_channel *chan, struct sk_buff *skb);
|
|||||||
static int ppp_async_push(struct asyncppp *ap);
|
static int ppp_async_push(struct asyncppp *ap);
|
||||||
static void ppp_async_flush_output(struct asyncppp *ap);
|
static void ppp_async_flush_output(struct asyncppp *ap);
|
||||||
static void ppp_async_input(struct asyncppp *ap, const unsigned char *buf,
|
static void ppp_async_input(struct asyncppp *ap, const unsigned char *buf,
|
||||||
const char *flags, int count);
|
const u8 *flags, int count);
|
||||||
static int ppp_async_ioctl(struct ppp_channel *chan, unsigned int cmd,
|
static int ppp_async_ioctl(struct ppp_channel *chan, unsigned int cmd,
|
||||||
unsigned long arg);
|
unsigned long arg);
|
||||||
static void ppp_async_process(struct tasklet_struct *t);
|
static void ppp_async_process(struct tasklet_struct *t);
|
||||||
@ -257,9 +257,8 @@ static void ppp_asynctty_hangup(struct tty_struct *tty)
|
|||||||
* Pppd reads and writes packets via /dev/ppp instead.
|
* Pppd reads and writes packets via /dev/ppp instead.
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ppp_asynctty_read(struct tty_struct *tty, struct file *file,
|
ppp_asynctty_read(struct tty_struct *tty, struct file *file, u8 *buf,
|
||||||
unsigned char *buf, size_t count,
|
size_t count, void **cookie, unsigned long offset)
|
||||||
void **cookie, unsigned long offset)
|
|
||||||
{
|
{
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@ -269,8 +268,8 @@ ppp_asynctty_read(struct tty_struct *tty, struct file *file,
|
|||||||
* from the ppp generic stuff.
|
* from the ppp generic stuff.
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ppp_asynctty_write(struct tty_struct *tty, struct file *file,
|
ppp_asynctty_write(struct tty_struct *tty, struct file *file, const u8 *buf,
|
||||||
const unsigned char *buf, size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@ -328,17 +327,10 @@ ppp_asynctty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No kernel lock - fine */
|
|
||||||
static __poll_t
|
|
||||||
ppp_asynctty_poll(struct tty_struct *tty, struct file *file, poll_table *wait)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* May sleep, don't call from interrupt level or with interrupts disabled */
|
/* May sleep, don't call from interrupt level or with interrupts disabled */
|
||||||
static void
|
static void
|
||||||
ppp_asynctty_receive(struct tty_struct *tty, const unsigned char *buf,
|
ppp_asynctty_receive(struct tty_struct *tty, const u8 *buf, const u8 *cflags,
|
||||||
const char *cflags, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct asyncppp *ap = ap_get(tty);
|
struct asyncppp *ap = ap_get(tty);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -378,7 +370,6 @@ static struct tty_ldisc_ops ppp_ldisc = {
|
|||||||
.read = ppp_asynctty_read,
|
.read = ppp_asynctty_read,
|
||||||
.write = ppp_asynctty_write,
|
.write = ppp_asynctty_write,
|
||||||
.ioctl = ppp_asynctty_ioctl,
|
.ioctl = ppp_asynctty_ioctl,
|
||||||
.poll = ppp_asynctty_poll,
|
|
||||||
.receive_buf = ppp_asynctty_receive,
|
.receive_buf = ppp_asynctty_receive,
|
||||||
.write_wakeup = ppp_asynctty_wakeup,
|
.write_wakeup = ppp_asynctty_wakeup,
|
||||||
};
|
};
|
||||||
@ -827,8 +818,7 @@ process_input_packet(struct asyncppp *ap)
|
|||||||
other ldisc functions but will not be re-entered */
|
other ldisc functions but will not be re-entered */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ppp_async_input(struct asyncppp *ap, const unsigned char *buf,
|
ppp_async_input(struct asyncppp *ap, const u8 *buf, const u8 *flags, int count)
|
||||||
const char *flags, int count)
|
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int c, i, j, n, s, f;
|
int c, i, j, n, s, f;
|
||||||
|
@ -93,8 +93,8 @@ static int ppp_sync_ioctl(struct ppp_channel *chan, unsigned int cmd,
|
|||||||
static void ppp_sync_process(struct tasklet_struct *t);
|
static void ppp_sync_process(struct tasklet_struct *t);
|
||||||
static int ppp_sync_push(struct syncppp *ap);
|
static int ppp_sync_push(struct syncppp *ap);
|
||||||
static void ppp_sync_flush_output(struct syncppp *ap);
|
static void ppp_sync_flush_output(struct syncppp *ap);
|
||||||
static void ppp_sync_input(struct syncppp *ap, const unsigned char *buf,
|
static void ppp_sync_input(struct syncppp *ap, const u8 *buf, const u8 *flags,
|
||||||
const char *flags, int count);
|
int count);
|
||||||
|
|
||||||
static const struct ppp_channel_ops sync_ops = {
|
static const struct ppp_channel_ops sync_ops = {
|
||||||
.start_xmit = ppp_sync_send,
|
.start_xmit = ppp_sync_send,
|
||||||
@ -255,8 +255,7 @@ static void ppp_sync_hangup(struct tty_struct *tty)
|
|||||||
* Pppd reads and writes packets via /dev/ppp instead.
|
* Pppd reads and writes packets via /dev/ppp instead.
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ppp_sync_read(struct tty_struct *tty, struct file *file,
|
ppp_sync_read(struct tty_struct *tty, struct file *file, u8 *buf, size_t count,
|
||||||
unsigned char *buf, size_t count,
|
|
||||||
void **cookie, unsigned long offset)
|
void **cookie, unsigned long offset)
|
||||||
{
|
{
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
@ -267,8 +266,8 @@ ppp_sync_read(struct tty_struct *tty, struct file *file,
|
|||||||
* from the ppp generic stuff.
|
* from the ppp generic stuff.
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ppp_sync_write(struct tty_struct *tty, struct file *file,
|
ppp_sync_write(struct tty_struct *tty, struct file *file, const u8 *buf,
|
||||||
const unsigned char *buf, size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
@ -321,17 +320,10 @@ ppp_synctty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No kernel lock - fine */
|
|
||||||
static __poll_t
|
|
||||||
ppp_sync_poll(struct tty_struct *tty, struct file *file, poll_table *wait)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* May sleep, don't call from interrupt level or with interrupts disabled */
|
/* May sleep, don't call from interrupt level or with interrupts disabled */
|
||||||
static void
|
static void
|
||||||
ppp_sync_receive(struct tty_struct *tty, const unsigned char *buf,
|
ppp_sync_receive(struct tty_struct *tty, const u8 *buf, const u8 *cflags,
|
||||||
const char *cflags, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct syncppp *ap = sp_get(tty);
|
struct syncppp *ap = sp_get(tty);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -371,7 +363,6 @@ static struct tty_ldisc_ops ppp_sync_ldisc = {
|
|||||||
.read = ppp_sync_read,
|
.read = ppp_sync_read,
|
||||||
.write = ppp_sync_write,
|
.write = ppp_sync_write,
|
||||||
.ioctl = ppp_synctty_ioctl,
|
.ioctl = ppp_synctty_ioctl,
|
||||||
.poll = ppp_sync_poll,
|
|
||||||
.receive_buf = ppp_sync_receive,
|
.receive_buf = ppp_sync_receive,
|
||||||
.write_wakeup = ppp_sync_wakeup,
|
.write_wakeup = ppp_sync_wakeup,
|
||||||
};
|
};
|
||||||
@ -663,8 +654,7 @@ ppp_sync_flush_output(struct syncppp *ap)
|
|||||||
* frame is considered to be in error and is tossed.
|
* frame is considered to be in error and is tossed.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
ppp_sync_input(struct syncppp *ap, const unsigned char *buf,
|
ppp_sync_input(struct syncppp *ap, const u8 *buf, const u8 *flags, int count)
|
||||||
const char *flags, int count)
|
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
@ -685,8 +685,8 @@ static void sl_setup(struct net_device *dev)
|
|||||||
* in parallel
|
* in parallel
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
|
static void slip_receive_buf(struct tty_struct *tty, const u8 *cp, const u8 *fp,
|
||||||
const char *fp, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct slip *sl = tty->disc_data;
|
struct slip *sl = tty->disc_data;
|
||||||
|
|
||||||
|
@ -1322,11 +1322,10 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close the requested serial port */
|
/* close the requested serial port */
|
||||||
static int hso_serial_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t hso_serial_write(struct tty_struct *tty, const u8 *buf,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct hso_serial *serial = tty->driver_data;
|
struct hso_serial *serial = tty->driver_data;
|
||||||
int space, tx_bytes;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* sanity check */
|
/* sanity check */
|
||||||
@ -1337,21 +1336,16 @@ static int hso_serial_write(struct tty_struct *tty, const unsigned char *buf,
|
|||||||
|
|
||||||
spin_lock_irqsave(&serial->serial_lock, flags);
|
spin_lock_irqsave(&serial->serial_lock, flags);
|
||||||
|
|
||||||
space = serial->tx_data_length - serial->tx_buffer_count;
|
count = min_t(size_t, serial->tx_data_length - serial->tx_buffer_count,
|
||||||
tx_bytes = (count < space) ? count : space;
|
count);
|
||||||
|
memcpy(serial->tx_buffer + serial->tx_buffer_count, buf, count);
|
||||||
|
serial->tx_buffer_count += count;
|
||||||
|
|
||||||
if (!tx_bytes)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
memcpy(serial->tx_buffer + serial->tx_buffer_count, buf, tx_bytes);
|
|
||||||
serial->tx_buffer_count += tx_bytes;
|
|
||||||
|
|
||||||
out:
|
|
||||||
spin_unlock_irqrestore(&serial->serial_lock, flags);
|
spin_unlock_irqrestore(&serial->serial_lock, flags);
|
||||||
|
|
||||||
hso_kick_transmit(serial);
|
hso_kick_transmit(serial);
|
||||||
/* done */
|
/* done */
|
||||||
return tx_bytes;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* how much room is there for writing */
|
/* how much room is there for writing */
|
||||||
|
@ -2655,6 +2655,7 @@ enum parport_pc_pci_cards {
|
|||||||
netmos_9815,
|
netmos_9815,
|
||||||
netmos_9901,
|
netmos_9901,
|
||||||
netmos_9865,
|
netmos_9865,
|
||||||
|
asix_ax99100,
|
||||||
quatech_sppxp100,
|
quatech_sppxp100,
|
||||||
wch_ch382l,
|
wch_ch382l,
|
||||||
};
|
};
|
||||||
@ -2733,6 +2734,7 @@ static struct parport_pc_pci {
|
|||||||
/* netmos_9815 */ { 2, { { 0, 1 }, { 2, 3 }, } },
|
/* netmos_9815 */ { 2, { { 0, 1 }, { 2, 3 }, } },
|
||||||
/* netmos_9901 */ { 1, { { 0, -1 }, } },
|
/* netmos_9901 */ { 1, { { 0, -1 }, } },
|
||||||
/* netmos_9865 */ { 1, { { 0, -1 }, } },
|
/* netmos_9865 */ { 1, { { 0, -1 }, } },
|
||||||
|
/* asix_ax99100 */ { 1, { { 0, 1 }, } },
|
||||||
/* quatech_sppxp100 */ { 1, { { 0, 1 }, } },
|
/* quatech_sppxp100 */ { 1, { { 0, 1 }, } },
|
||||||
/* wch_ch382l */ { 1, { { 2, -1 }, } },
|
/* wch_ch382l */ { 1, { { 2, -1 }, } },
|
||||||
};
|
};
|
||||||
@ -2823,6 +2825,9 @@ static const struct pci_device_id parport_pc_pci_tbl[] = {
|
|||||||
0xA000, 0x1000, 0, 0, netmos_9865 },
|
0xA000, 0x1000, 0, 0, netmos_9865 },
|
||||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
||||||
0xA000, 0x2000, 0, 0, netmos_9865 },
|
0xA000, 0x2000, 0, 0, netmos_9865 },
|
||||||
|
/* ASIX AX99100 PCIe to Multi I/O Controller */
|
||||||
|
{ PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
|
||||||
|
0xA000, 0x2000, 0, 0, asix_ax99100 },
|
||||||
/* Quatech SPPXP-100 Parallel port PCI ExpressCard */
|
/* Quatech SPPXP-100 Parallel port PCI ExpressCard */
|
||||||
{ PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SPPXP_100,
|
{ PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SPPXP_100,
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 },
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 },
|
||||||
|
@ -1021,8 +1021,8 @@ static unsigned int tty3215_write_room(struct tty_struct *tty)
|
|||||||
/*
|
/*
|
||||||
* String write routine for 3215 ttys
|
* String write routine for 3215 ttys
|
||||||
*/
|
*/
|
||||||
static int tty3215_write(struct tty_struct *tty,
|
static ssize_t tty3215_write(struct tty_struct *tty, const u8 *buf,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
handle_write(tty->driver_data, buf, count);
|
handle_write(tty->driver_data, buf, count);
|
||||||
return count;
|
return count;
|
||||||
@ -1031,7 +1031,7 @@ static int tty3215_write(struct tty_struct *tty,
|
|||||||
/*
|
/*
|
||||||
* Put character routine for 3215 ttys
|
* Put character routine for 3215 ttys
|
||||||
*/
|
*/
|
||||||
static int tty3215_put_char(struct tty_struct *tty, unsigned char ch)
|
static int tty3215_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
struct raw3215_info *raw = tty->driver_data;
|
struct raw3215_info *raw = tty->driver_data;
|
||||||
|
|
||||||
|
@ -1803,8 +1803,8 @@ static void tty3270_do_write(struct tty3270 *tp, struct tty_struct *tty,
|
|||||||
/*
|
/*
|
||||||
* String write routine for 3270 ttys
|
* String write routine for 3270 ttys
|
||||||
*/
|
*/
|
||||||
static int tty3270_write(struct tty_struct *tty,
|
static ssize_t tty3270_write(struct tty_struct *tty, const u8 *buf,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct tty3270 *tp;
|
struct tty3270 *tp;
|
||||||
|
|
||||||
@ -1822,7 +1822,7 @@ static int tty3270_write(struct tty_struct *tty,
|
|||||||
/*
|
/*
|
||||||
* Put single characters to the ttys character buffer
|
* Put single characters to the ttys character buffer
|
||||||
*/
|
*/
|
||||||
static int tty3270_put_char(struct tty_struct *tty, unsigned char ch)
|
static int tty3270_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
struct tty3270 *tp;
|
struct tty3270 *tp;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ static struct sclp_buffer *sclp_ttybuf;
|
|||||||
static struct timer_list sclp_tty_timer;
|
static struct timer_list sclp_tty_timer;
|
||||||
|
|
||||||
static struct tty_port sclp_port;
|
static struct tty_port sclp_port;
|
||||||
static unsigned char sclp_tty_chars[SCLP_TTY_BUF_SIZE];
|
static u8 sclp_tty_chars[SCLP_TTY_BUF_SIZE];
|
||||||
static unsigned short int sclp_tty_chars_count;
|
static unsigned short int sclp_tty_chars_count;
|
||||||
|
|
||||||
struct tty_driver *sclp_tty_driver;
|
struct tty_driver *sclp_tty_driver;
|
||||||
@ -168,7 +168,7 @@ sclp_tty_timeout(struct timer_list *unused)
|
|||||||
/*
|
/*
|
||||||
* Write a string to the sclp tty.
|
* Write a string to the sclp tty.
|
||||||
*/
|
*/
|
||||||
static int sclp_tty_write_string(const unsigned char *str, int count, int may_fail)
|
static int sclp_tty_write_string(const u8 *str, int count, int may_fail)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void *page;
|
void *page;
|
||||||
@ -229,8 +229,8 @@ out:
|
|||||||
* tty device. The characters may come from user space or kernel space. This
|
* tty device. The characters may come from user space or kernel space. This
|
||||||
* routine will return the number of characters actually accepted for writing.
|
* routine will return the number of characters actually accepted for writing.
|
||||||
*/
|
*/
|
||||||
static int
|
static ssize_t
|
||||||
sclp_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
sclp_tty_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
if (sclp_tty_chars_count > 0) {
|
if (sclp_tty_chars_count > 0) {
|
||||||
sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0);
|
sclp_tty_write_string(sclp_tty_chars, sclp_tty_chars_count, 0);
|
||||||
@ -250,7 +250,7 @@ sclp_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
|||||||
* sclp_write() without final '\n' - will be written.
|
* sclp_write() without final '\n' - will be written.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
sclp_tty_put_char(struct tty_struct *tty, unsigned char ch)
|
sclp_tty_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
sclp_tty_chars[sclp_tty_chars_count++] = ch;
|
sclp_tty_chars[sclp_tty_chars_count++] = ch;
|
||||||
if (ch == '\n' || sclp_tty_chars_count >= SCLP_TTY_BUF_SIZE) {
|
if (ch == '\n' || sclp_tty_chars_count >= SCLP_TTY_BUF_SIZE) {
|
||||||
|
@ -462,8 +462,8 @@ out:
|
|||||||
* user space or kernel space. This routine will return the
|
* user space or kernel space. This routine will return the
|
||||||
* number of characters actually accepted for writing.
|
* number of characters actually accepted for writing.
|
||||||
*/
|
*/
|
||||||
static int
|
static ssize_t
|
||||||
sclp_vt220_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
sclp_vt220_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
return __sclp_vt220_write(buf, count, 1, 0, 1);
|
return __sclp_vt220_write(buf, count, 1, 0, 1);
|
||||||
}
|
}
|
||||||
@ -579,7 +579,7 @@ sclp_vt220_close(struct tty_struct *tty, struct file *filp)
|
|||||||
* done stuffing characters into the driver.
|
* done stuffing characters into the driver.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
sclp_vt220_put_char(struct tty_struct *tty, unsigned char ch)
|
sclp_vt220_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
return __sclp_vt220_write(&ch, 1, 0, 0, 1);
|
return __sclp_vt220_write(&ch, 1, 0, 0, 1);
|
||||||
}
|
}
|
||||||
|
@ -149,22 +149,17 @@ static void gdm_tty_send_complete(void *arg)
|
|||||||
tty_port_tty_wakeup(&gdm->port);
|
tty_port_tty_wakeup(&gdm->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gdm_tty_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t gdm_tty_write(struct tty_struct *tty, const u8 *buf, size_t len)
|
||||||
int len)
|
|
||||||
{
|
{
|
||||||
struct gdm *gdm = tty->driver_data;
|
struct gdm *gdm = tty->driver_data;
|
||||||
int remain = len;
|
size_t remain = len;
|
||||||
int sent_len = 0;
|
size_t sent_len = 0;
|
||||||
int sending_len = 0;
|
|
||||||
|
|
||||||
if (!gdm_tty_ready(gdm))
|
if (!gdm_tty_ready(gdm))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!len)
|
while (remain) {
|
||||||
return 0;
|
size_t sending_len = min_t(size_t, MUX_TX_MAX_SIZE, remain);
|
||||||
|
|
||||||
while (1) {
|
|
||||||
sending_len = min(MUX_TX_MAX_SIZE, remain);
|
|
||||||
gdm->tty_dev->send_func(gdm->tty_dev->priv_dev,
|
gdm->tty_dev->send_func(gdm->tty_dev->priv_dev,
|
||||||
(void *)(buf + sent_len),
|
(void *)(buf + sent_len),
|
||||||
sending_len,
|
sending_len,
|
||||||
@ -173,8 +168,6 @@ static int gdm_tty_write(struct tty_struct *tty, const unsigned char *buf,
|
|||||||
gdm);
|
gdm);
|
||||||
sent_len += sending_len;
|
sent_len += sending_len;
|
||||||
remain -= sending_len;
|
remain -= sending_len;
|
||||||
if (remain <= 0)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
@ -427,8 +427,7 @@ static void gb_tty_hangup(struct tty_struct *tty)
|
|||||||
tty_port_hangup(&gb_tty->port);
|
tty_port_hangup(&gb_tty->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gb_tty_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t gb_tty_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
int count)
|
|
||||||
{
|
{
|
||||||
struct gb_tty *gb_tty = tty->driver_data;
|
struct gb_tty *gb_tty = tty->driver_data;
|
||||||
|
|
||||||
|
@ -239,6 +239,7 @@ config MOXA_SMARTIO
|
|||||||
config SYNCLINK_GT
|
config SYNCLINK_GT
|
||||||
tristate "SyncLink GT/AC support"
|
tristate "SyncLink GT/AC support"
|
||||||
depends on SERIAL_NONSTANDARD && PCI
|
depends on SERIAL_NONSTANDARD && PCI
|
||||||
|
depends on BROKEN
|
||||||
help
|
help
|
||||||
Support for SyncLink GT and SyncLink AC families of
|
Support for SyncLink GT and SyncLink AC families of
|
||||||
synchronous and asynchronous serial adapters
|
synchronous and asynchronous serial adapters
|
||||||
|
@ -696,7 +696,7 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info,
|
|||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rs_put_char(struct tty_struct *tty, unsigned char ch)
|
static int rs_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
struct serial_state *info;
|
struct serial_state *info;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -741,7 +741,7 @@ static void rs_flush_chars(struct tty_struct *tty)
|
|||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rs_write(struct tty_struct * tty, const unsigned char *buf, int count)
|
static ssize_t rs_write(struct tty_struct * tty, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
int c, ret = 0;
|
int c, ret = 0;
|
||||||
struct serial_state *info = tty->driver_data;
|
struct serial_state *info = tty->driver_data;
|
||||||
|
@ -466,8 +466,8 @@ static irqreturn_t ehv_bc_tty_tx_isr(int irq, void *data)
|
|||||||
* ehv_bc_tty_write_room() will never lie, so the tty layer will never send us
|
* ehv_bc_tty_write_room() will never lie, so the tty layer will never send us
|
||||||
* too much data.
|
* too much data.
|
||||||
*/
|
*/
|
||||||
static int ehv_bc_tty_write(struct tty_struct *ttys, const unsigned char *s,
|
static ssize_t ehv_bc_tty_write(struct tty_struct *ttys, const u8 *s,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct ehv_bc_data *bc = ttys->driver_data;
|
struct ehv_bc_data *bc = ttys->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -125,8 +125,7 @@ static void goldfish_tty_rw(struct goldfish_tty *qtty,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void goldfish_tty_do_write(int line, const char *buf,
|
static void goldfish_tty_do_write(int line, const u8 *buf, unsigned int count)
|
||||||
unsigned int count)
|
|
||||||
{
|
{
|
||||||
struct goldfish_tty *qtty = &goldfish_ttys[line];
|
struct goldfish_tty *qtty = &goldfish_ttys[line];
|
||||||
unsigned long address = (unsigned long)(void *)buf;
|
unsigned long address = (unsigned long)(void *)buf;
|
||||||
@ -186,8 +185,8 @@ static void goldfish_tty_hangup(struct tty_struct *tty)
|
|||||||
tty_port_hangup(tty->port);
|
tty_port_hangup(tty->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int goldfish_tty_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t goldfish_tty_write(struct tty_struct *tty, const u8 *buf,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
goldfish_tty_do_write(tty->index, buf, count);
|
goldfish_tty_do_write(tty->index, buf, count);
|
||||||
return count;
|
return count;
|
||||||
|
@ -496,11 +496,11 @@ static int hvc_push(struct hvc_struct *hp)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
static ssize_t hvc_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct hvc_struct *hp = tty->driver_data;
|
struct hvc_struct *hp = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int rsize, written = 0;
|
size_t rsize, written = 0;
|
||||||
|
|
||||||
/* This write was probably executed during a tty close. */
|
/* This write was probably executed during a tty close. */
|
||||||
if (!hp)
|
if (!hp)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
|
@ -1257,15 +1257,14 @@ static void hvcs_hangup(struct tty_struct * tty)
|
|||||||
* tty_hangup will allow hvcs_write time to complete execution before it
|
* tty_hangup will allow hvcs_write time to complete execution before it
|
||||||
* terminates our device.
|
* terminates our device.
|
||||||
*/
|
*/
|
||||||
static int hvcs_write(struct tty_struct *tty,
|
static ssize_t hvcs_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
const unsigned char *buf, int count)
|
|
||||||
{
|
{
|
||||||
struct hvcs_struct *hvcsd = tty->driver_data;
|
struct hvcs_struct *hvcsd = tty->driver_data;
|
||||||
unsigned int unit_address;
|
unsigned int unit_address;
|
||||||
const unsigned char *charbuf;
|
const unsigned char *charbuf;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int total_sent = 0;
|
size_t total_sent = 0;
|
||||||
int tosend = 0;
|
size_t tosend = 0;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1300,7 +1299,8 @@ static int hvcs_write(struct tty_struct *tty,
|
|||||||
unit_address = hvcsd->vdev->unit_address;
|
unit_address = hvcsd->vdev->unit_address;
|
||||||
|
|
||||||
while (count > 0) {
|
while (count > 0) {
|
||||||
tosend = min(count, (HVCS_BUFF_LEN - hvcsd->chars_in_buffer));
|
tosend = min_t(size_t, count,
|
||||||
|
(HVCS_BUFF_LEN - hvcsd->chars_in_buffer));
|
||||||
/*
|
/*
|
||||||
* No more space, this probably means that the last call to
|
* No more space, this probably means that the last call to
|
||||||
* hvcs_write() didn't succeed and the buffer was filled up.
|
* hvcs_write() didn't succeed and the buffer was filled up.
|
||||||
|
@ -904,14 +904,13 @@ static unsigned int hvsi_chars_in_buffer(struct tty_struct *tty)
|
|||||||
return hp->n_outbuf;
|
return hp->n_outbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hvsi_write(struct tty_struct *tty,
|
static ssize_t hvsi_write(struct tty_struct *tty, const u8 *source,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct hvsi_struct *hp = tty->driver_data;
|
struct hvsi_struct *hp = tty->driver_data;
|
||||||
const char *source = buf;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int total = 0;
|
size_t total = 0;
|
||||||
int origcount = count;
|
size_t origcount = count;
|
||||||
|
|
||||||
spin_lock_irqsave(&hp->lock, flags);
|
spin_lock_irqsave(&hp->lock, flags);
|
||||||
|
|
||||||
@ -929,7 +928,7 @@ static int hvsi_write(struct tty_struct *tty,
|
|||||||
* will see there is no room in outbuf and return.
|
* will see there is no room in outbuf and return.
|
||||||
*/
|
*/
|
||||||
while ((count > 0) && (hvsi_write_room(tty) > 0)) {
|
while ((count > 0) && (hvsi_write_room(tty) > 0)) {
|
||||||
int chunksize = min_t(int, count, hvsi_write_room(tty));
|
size_t chunksize = min_t(size_t, count, hvsi_write_room(tty));
|
||||||
|
|
||||||
BUG_ON(hp->n_outbuf < 0);
|
BUG_ON(hp->n_outbuf < 0);
|
||||||
memcpy(hp->outbuf + hp->n_outbuf, source, chunksize);
|
memcpy(hp->outbuf + hp->n_outbuf, source, chunksize);
|
||||||
@ -953,8 +952,8 @@ out:
|
|||||||
spin_unlock_irqrestore(&hp->lock, flags);
|
spin_unlock_irqrestore(&hp->lock, flags);
|
||||||
|
|
||||||
if (total != origcount)
|
if (total != origcount)
|
||||||
pr_debug("%s: wanted %i, only wrote %i\n", __func__, origcount,
|
pr_debug("%s: wanted %zu, only wrote %zu\n", __func__,
|
||||||
total);
|
origcount, total);
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
@ -1292,7 +1292,7 @@ static void *alloc_ctrl_packet(int header_size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ipwireless_send_packet(struct ipw_hardware *hw, unsigned int channel_idx,
|
int ipwireless_send_packet(struct ipw_hardware *hw, unsigned int channel_idx,
|
||||||
const unsigned char *data, unsigned int length,
|
const u8 *data, unsigned int length,
|
||||||
void (*callback) (void *cb, unsigned int length),
|
void (*callback) (void *cb, unsigned int length),
|
||||||
void *callback_data)
|
void *callback_data)
|
||||||
{
|
{
|
||||||
|
@ -186,8 +186,8 @@ static void ipw_write_packet_sent_callback(void *callback_data,
|
|||||||
tty->tx_bytes_queued -= packet_length;
|
tty->tx_bytes_queued -= packet_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipw_write(struct tty_struct *linux_tty,
|
static ssize_t ipw_write(struct tty_struct *linux_tty, const u8 *buf,
|
||||||
const unsigned char *buf, int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct ipw_tty *tty = linux_tty->driver_data;
|
struct ipw_tty *tty = linux_tty->driver_data;
|
||||||
int room, ret;
|
int room, ret;
|
||||||
|
@ -796,8 +796,8 @@ static void mips_ejtag_fdc_tty_hangup(struct tty_struct *tty)
|
|||||||
tty_port_hangup(tty->port);
|
tty_port_hangup(tty->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mips_ejtag_fdc_tty_write(struct tty_struct *tty,
|
static ssize_t mips_ejtag_fdc_tty_write(struct tty_struct *tty, const u8 *buf,
|
||||||
const unsigned char *buf, int total)
|
size_t total)
|
||||||
{
|
{
|
||||||
int count, block;
|
int count, block;
|
||||||
struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
|
struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
|
||||||
@ -816,7 +816,7 @@ static int mips_ejtag_fdc_tty_write(struct tty_struct *tty,
|
|||||||
*/
|
*/
|
||||||
spin_lock(&dport->xmit_lock);
|
spin_lock(&dport->xmit_lock);
|
||||||
/* Work out how many bytes we can write to the xmit buffer */
|
/* Work out how many bytes we can write to the xmit buffer */
|
||||||
total = min(total, (int)(priv->xmit_size - dport->xmit_cnt));
|
total = min_t(size_t, total, priv->xmit_size - dport->xmit_cnt);
|
||||||
atomic_add(total, &priv->xmit_total);
|
atomic_add(total, &priv->xmit_total);
|
||||||
dport->xmit_cnt += total;
|
dport->xmit_cnt += total;
|
||||||
/* Write the actual bytes (may need splitting if it wraps) */
|
/* Write the actual bytes (may need splitting if it wraps) */
|
||||||
|
@ -487,7 +487,7 @@ module_param(ttymajor, int, 0);
|
|||||||
*/
|
*/
|
||||||
static int moxa_open(struct tty_struct *, struct file *);
|
static int moxa_open(struct tty_struct *, struct file *);
|
||||||
static void moxa_close(struct tty_struct *, struct file *);
|
static void moxa_close(struct tty_struct *, struct file *);
|
||||||
static int moxa_write(struct tty_struct *, const unsigned char *, int);
|
static ssize_t moxa_write(struct tty_struct *, const u8 *, size_t);
|
||||||
static unsigned int moxa_write_room(struct tty_struct *);
|
static unsigned int moxa_write_room(struct tty_struct *);
|
||||||
static void moxa_flush_buffer(struct tty_struct *);
|
static void moxa_flush_buffer(struct tty_struct *);
|
||||||
static unsigned int moxa_chars_in_buffer(struct tty_struct *);
|
static unsigned int moxa_chars_in_buffer(struct tty_struct *);
|
||||||
@ -1499,8 +1499,7 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
|
|||||||
tty_port_close(&ch->port, tty, filp);
|
tty_port_close(&ch->port, tty, filp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int moxa_write(struct tty_struct *tty,
|
static ssize_t moxa_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
const unsigned char *buf, int count)
|
|
||||||
{
|
{
|
||||||
struct moxa_port *ch = tty->driver_data;
|
struct moxa_port *ch = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -2164,8 +2163,7 @@ static int MoxaPortLineStatus(struct moxa_port *port)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int MoxaPortWriteData(struct tty_struct *tty,
|
static int MoxaPortWriteData(struct tty_struct *tty, const u8 *buffer, int len)
|
||||||
const unsigned char *buffer, int len)
|
|
||||||
{
|
{
|
||||||
struct moxa_port *port = tty->driver_data;
|
struct moxa_port *port = tty->driver_data;
|
||||||
void __iomem *baseAddr, *ofsAddr, *ofs;
|
void __iomem *baseAddr, *ofsAddr, *ofs;
|
||||||
|
@ -901,7 +901,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
|
|||||||
tty_port_close(tty->port, tty, filp);
|
tty_port_close(tty->port, tty, filp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
static ssize_t mxser_write(struct tty_struct *tty, const u8 *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct mxser_port *info = tty->driver_data;
|
struct mxser_port *info = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -920,7 +920,7 @@ static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int cou
|
|||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mxser_put_char(struct tty_struct *tty, unsigned char ch)
|
static int mxser_put_char(struct tty_struct *tty, u8 ch)
|
||||||
{
|
{
|
||||||
struct mxser_port *info = tty->driver_data;
|
struct mxser_port *info = tty->driver_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -339,6 +339,7 @@ struct gsm_mux {
|
|||||||
unsigned long bad_fcs;
|
unsigned long bad_fcs;
|
||||||
unsigned long malformed;
|
unsigned long malformed;
|
||||||
unsigned long io_error;
|
unsigned long io_error;
|
||||||
|
unsigned long open_error;
|
||||||
unsigned long bad_size;
|
unsigned long bad_size;
|
||||||
unsigned long unsupported;
|
unsigned long unsupported;
|
||||||
};
|
};
|
||||||
@ -1450,15 +1451,16 @@ static int gsm_control_command(struct gsm_mux *gsm, int cmd, const u8 *data,
|
|||||||
int dlen)
|
int dlen)
|
||||||
{
|
{
|
||||||
struct gsm_msg *msg;
|
struct gsm_msg *msg;
|
||||||
|
struct gsm_dlci *dlci = gsm->dlci[0];
|
||||||
|
|
||||||
msg = gsm_data_alloc(gsm, 0, dlen + 2, gsm->dlci[0]->ftype);
|
msg = gsm_data_alloc(gsm, 0, dlen + 2, dlci->ftype);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
msg->data[0] = (cmd << 1) | CR | EA; /* Set C/R */
|
msg->data[0] = (cmd << 1) | CR | EA; /* Set C/R */
|
||||||
msg->data[1] = (dlen << 1) | EA;
|
msg->data[1] = (dlen << 1) | EA;
|
||||||
memcpy(msg->data + 2, data, dlen);
|
memcpy(msg->data + 2, data, dlen);
|
||||||
gsm_data_queue(gsm->dlci[0], msg);
|
gsm_data_queue(dlci, msg);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1477,14 +1479,15 @@ static void gsm_control_reply(struct gsm_mux *gsm, int cmd, const u8 *data,
|
|||||||
int dlen)
|
int dlen)
|
||||||
{
|
{
|
||||||
struct gsm_msg *msg;
|
struct gsm_msg *msg;
|
||||||
|
struct gsm_dlci *dlci = gsm->dlci[0];
|
||||||
|
|
||||||
msg = gsm_data_alloc(gsm, 0, dlen + 2, gsm->dlci[0]->ftype);
|
msg = gsm_data_alloc(gsm, 0, dlen + 2, dlci->ftype);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
return;
|
return;
|
||||||
msg->data[0] = (cmd & 0xFE) << 1 | EA; /* Clear C/R */
|
msg->data[0] = (cmd & 0xFE) << 1 | EA; /* Clear C/R */
|
||||||
msg->data[1] = (dlen << 1) | EA;
|
msg->data[1] = (dlen << 1) | EA;
|
||||||
memcpy(msg->data + 2, data, dlen);
|
memcpy(msg->data + 2, data, dlen);
|
||||||
gsm_data_queue(gsm->dlci[0], msg);
|
gsm_data_queue(dlci, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1589,6 +1592,7 @@ static int gsm_process_negotiation(struct gsm_mux *gsm, unsigned int addr,
|
|||||||
if (debug & DBG_ERRORS)
|
if (debug & DBG_ERRORS)
|
||||||
pr_info("%s unsupported I frame request in PN\n",
|
pr_info("%s unsupported I frame request in PN\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
gsm->unsupported++;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
default:
|
default:
|
||||||
if (debug & DBG_ERRORS)
|
if (debug & DBG_ERRORS)
|
||||||
@ -1730,25 +1734,32 @@ static void gsm_control_negotiation(struct gsm_mux *gsm, unsigned int cr,
|
|||||||
struct gsm_dlci *dlci;
|
struct gsm_dlci *dlci;
|
||||||
struct gsm_dlci_param_bits *params;
|
struct gsm_dlci_param_bits *params;
|
||||||
|
|
||||||
if (dlen < sizeof(struct gsm_dlci_param_bits))
|
if (dlen < sizeof(struct gsm_dlci_param_bits)) {
|
||||||
|
gsm->open_error++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Invalid DLCI? */
|
/* Invalid DLCI? */
|
||||||
params = (struct gsm_dlci_param_bits *)data;
|
params = (struct gsm_dlci_param_bits *)data;
|
||||||
addr = FIELD_GET(PN_D_FIELD_DLCI, params->d_bits);
|
addr = FIELD_GET(PN_D_FIELD_DLCI, params->d_bits);
|
||||||
if (addr == 0 || addr >= NUM_DLCI || !gsm->dlci[addr])
|
if (addr == 0 || addr >= NUM_DLCI || !gsm->dlci[addr]) {
|
||||||
|
gsm->open_error++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
dlci = gsm->dlci[addr];
|
dlci = gsm->dlci[addr];
|
||||||
|
|
||||||
/* Too late for parameter negotiation? */
|
/* Too late for parameter negotiation? */
|
||||||
if ((!cr && dlci->state == DLCI_OPENING) || dlci->state == DLCI_OPEN)
|
if ((!cr && dlci->state == DLCI_OPENING) || dlci->state == DLCI_OPEN) {
|
||||||
|
gsm->open_error++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Process the received parameters */
|
/* Process the received parameters */
|
||||||
if (gsm_process_negotiation(gsm, addr, cr, params) != 0) {
|
if (gsm_process_negotiation(gsm, addr, cr, params) != 0) {
|
||||||
/* Negotiation failed. Close the link. */
|
/* Negotiation failed. Close the link. */
|
||||||
if (debug & DBG_ERRORS)
|
if (debug & DBG_ERRORS)
|
||||||
pr_info("%s PN failed\n", __func__);
|
pr_info("%s PN failed\n", __func__);
|
||||||
|
gsm->open_error++;
|
||||||
gsm_dlci_close(dlci);
|
gsm_dlci_close(dlci);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1768,6 +1779,7 @@ static void gsm_control_negotiation(struct gsm_mux *gsm, unsigned int cr,
|
|||||||
} else {
|
} else {
|
||||||
if (debug & DBG_ERRORS)
|
if (debug & DBG_ERRORS)
|
||||||
pr_info("%s PN in invalid state\n", __func__);
|
pr_info("%s PN in invalid state\n", __func__);
|
||||||
|
gsm->open_error++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1888,6 +1900,8 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
|
|||||||
/* Optional unsupported commands */
|
/* Optional unsupported commands */
|
||||||
case CMD_RPN: /* Remote port negotiation */
|
case CMD_RPN: /* Remote port negotiation */
|
||||||
case CMD_SNC: /* Service negotiation command */
|
case CMD_SNC: /* Service negotiation command */
|
||||||
|
gsm->unsupported++;
|
||||||
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
/* Reply to bad commands with an NSC */
|
/* Reply to bad commands with an NSC */
|
||||||
buf[0] = command;
|
buf[0] = command;
|
||||||
@ -2221,6 +2235,7 @@ static void gsm_dlci_t1(struct timer_list *t)
|
|||||||
dlci->retries--;
|
dlci->retries--;
|
||||||
mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
|
mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100);
|
||||||
} else {
|
} else {
|
||||||
|
gsm->open_error++;
|
||||||
gsm_dlci_begin_close(dlci); /* prevent half open link */
|
gsm_dlci_begin_close(dlci); /* prevent half open link */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2236,6 +2251,7 @@ static void gsm_dlci_t1(struct timer_list *t)
|
|||||||
dlci->mode = DLCI_MODE_ADM;
|
dlci->mode = DLCI_MODE_ADM;
|
||||||
gsm_dlci_open(dlci);
|
gsm_dlci_open(dlci);
|
||||||
} else {
|
} else {
|
||||||
|
gsm->open_error++;
|
||||||
gsm_dlci_begin_close(dlci); /* prevent half open link */
|
gsm_dlci_begin_close(dlci); /* prevent half open link */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2444,8 +2460,10 @@ static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
|
|||||||
data += dlen;
|
data += dlen;
|
||||||
|
|
||||||
/* Malformed command? */
|
/* Malformed command? */
|
||||||
if (clen > len)
|
if (clen > len) {
|
||||||
|
dlci->gsm->malformed++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (command & 1)
|
if (command & 1)
|
||||||
gsm_control_message(dlci->gsm, command, data, clen);
|
gsm_control_message(dlci->gsm, command, data, clen);
|
||||||
@ -2532,6 +2550,8 @@ static int gsm_dlci_config(struct gsm_dlci *dlci, struct gsm_dlci_config *dc, in
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (dc->k > 7)
|
if (dc->k > 7)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (dc->flags & ~GSM_FL_RESTART) /* allow future extensions */
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See what is needed for reconfiguration
|
* See what is needed for reconfiguration
|
||||||
@ -2546,6 +2566,8 @@ static int gsm_dlci_config(struct gsm_dlci *dlci, struct gsm_dlci_config *dc, in
|
|||||||
/* Requires care */
|
/* Requires care */
|
||||||
if (dc->priority != dlci->prio)
|
if (dc->priority != dlci->prio)
|
||||||
need_restart = true;
|
need_restart = true;
|
||||||
|
if (dc->flags & GSM_FL_RESTART)
|
||||||
|
need_restart = true;
|
||||||
|
|
||||||
if ((open && gsm->wait_config) || need_restart)
|
if ((open && gsm->wait_config) || need_restart)
|
||||||
need_open = true;
|
need_open = true;
|
||||||
@ -2753,12 +2775,16 @@ static void gsm_queue(struct gsm_mux *gsm)
|
|||||||
|
|
||||||
switch (gsm->control) {
|
switch (gsm->control) {
|
||||||
case SABM|PF:
|
case SABM|PF:
|
||||||
if (cr == 1)
|
if (cr == 1) {
|
||||||
|
gsm->open_error++;
|
||||||
goto invalid;
|
goto invalid;
|
||||||
|
}
|
||||||
if (dlci == NULL)
|
if (dlci == NULL)
|
||||||
dlci = gsm_dlci_alloc(gsm, address);
|
dlci = gsm_dlci_alloc(gsm, address);
|
||||||
if (dlci == NULL)
|
if (dlci == NULL) {
|
||||||
|
gsm->open_error++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
if (dlci->dead)
|
if (dlci->dead)
|
||||||
gsm_response(gsm, address, DM|PF);
|
gsm_response(gsm, address, DM|PF);
|
||||||
else {
|
else {
|
||||||
@ -3276,7 +3302,6 @@ static void gsm_copy_config_values(struct gsm_mux *gsm,
|
|||||||
|
|
||||||
static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
|
static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
int need_close = 0;
|
int need_close = 0;
|
||||||
int need_restart = 0;
|
int need_restart = 0;
|
||||||
|
|
||||||
@ -3355,7 +3380,7 @@ static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c)
|
|||||||
* and removing from the mux array
|
* and removing from the mux array
|
||||||
*/
|
*/
|
||||||
if (gsm->dead) {
|
if (gsm->dead) {
|
||||||
ret = gsm_activate_mux(gsm);
|
int ret = gsm_activate_mux(gsm);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
if (gsm->initiator)
|
if (gsm->initiator)
|
||||||
@ -3374,6 +3399,7 @@ static void gsm_copy_config_ext_values(struct gsm_mux *gsm,
|
|||||||
|
|
||||||
static int gsm_config_ext(struct gsm_mux *gsm, struct gsm_config_ext *ce)
|
static int gsm_config_ext(struct gsm_mux *gsm, struct gsm_config_ext *ce)
|
||||||
{
|
{
|
||||||
|
bool need_restart = false;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3383,6 +3409,20 @@ static int gsm_config_ext(struct gsm_mux *gsm, struct gsm_config_ext *ce)
|
|||||||
for (i = 0; i < ARRAY_SIZE(ce->reserved); i++)
|
for (i = 0; i < ARRAY_SIZE(ce->reserved); i++)
|
||||||
if (ce->reserved[i])
|
if (ce->reserved[i])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (ce->flags & ~GSM_FL_RESTART)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* Requires care */
|
||||||
|
if (ce->flags & GSM_FL_RESTART)
|
||||||
|
need_restart = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close down what is needed, restart and initiate the new
|
||||||
|
* configuration. On the first time there is no DLCI[0]
|
||||||
|
* and closing or cleaning up is not necessary.
|
||||||
|
*/
|
||||||
|
if (need_restart)
|
||||||
|
gsm_cleanup_mux(gsm, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the new configuration values
|
* Setup the new configuration values
|
||||||
@ -3390,6 +3430,14 @@ static int gsm_config_ext(struct gsm_mux *gsm, struct gsm_config_ext *ce)
|
|||||||
gsm->wait_config = ce->wait_config ? true : false;
|
gsm->wait_config = ce->wait_config ? true : false;
|
||||||
gsm->keep_alive = ce->keep_alive;
|
gsm->keep_alive = ce->keep_alive;
|
||||||
|
|
||||||
|
if (gsm->dead) {
|
||||||
|
int ret = gsm_activate_mux(gsm);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
if (gsm->initiator)
|
||||||
|
gsm_dlci_begin_open(gsm->dlci[0]);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3490,8 +3538,8 @@ static void gsmld_detach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
|
|||||||
gsm->tty = NULL;
|
gsm->tty = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
|
static void gsmld_receive_buf(struct tty_struct *tty, const u8 *cp,
|
||||||
const char *fp, int count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct gsm_mux *gsm = tty->disc_data;
|
struct gsm_mux *gsm = tty->disc_data;
|
||||||
char flags = TTY_NORMAL;
|
char flags = TTY_NORMAL;
|
||||||
@ -3577,6 +3625,9 @@ static int gsmld_open(struct tty_struct *tty)
|
|||||||
{
|
{
|
||||||
struct gsm_mux *gsm;
|
struct gsm_mux *gsm;
|
||||||
|
|
||||||
|
if (!capable(CAP_NET_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
if (tty->ops->write == NULL)
|
if (tty->ops->write == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@ -3636,9 +3687,8 @@ static void gsmld_write_wakeup(struct tty_struct *tty)
|
|||||||
* This code must be sure never to sleep through a hangup.
|
* This code must be sure never to sleep through a hangup.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static ssize_t gsmld_read(struct tty_struct *tty, struct file *file,
|
static ssize_t gsmld_read(struct tty_struct *tty, struct file *file, u8 *buf,
|
||||||
unsigned char *buf, size_t nr,
|
size_t nr, void **cookie, unsigned long offset)
|
||||||
void **cookie, unsigned long offset)
|
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
@ -3658,7 +3708,7 @@ static ssize_t gsmld_read(struct tty_struct *tty, struct file *file,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
|
static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
|
||||||
const unsigned char *buf, size_t nr)
|
const u8 *buf, size_t nr)
|
||||||
{
|
{
|
||||||
struct gsm_mux *gsm = tty->disc_data;
|
struct gsm_mux *gsm = tty->disc_data;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
@ -4254,8 +4304,7 @@ static void gsmtty_hangup(struct tty_struct *tty)
|
|||||||
gsm_dlci_begin_close(dlci);
|
gsm_dlci_begin_close(dlci);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gsmtty_write(struct tty_struct *tty, const unsigned char *buf,
|
static ssize_t gsmtty_write(struct tty_struct *tty, const u8 *buf, size_t len)
|
||||||
int len)
|
|
||||||
{
|
{
|
||||||
int sent;
|
int sent;
|
||||||
struct gsm_dlci *dlci = tty->driver_data;
|
struct gsm_dlci *dlci = tty->driver_data;
|
||||||
|
@ -369,13 +369,13 @@ static void n_hdlc_tty_wakeup(struct tty_struct *tty)
|
|||||||
* Called by tty low level driver when receive data is available. Data is
|
* Called by tty low level driver when receive data is available. Data is
|
||||||
* interpreted as one HDLC frame.
|
* interpreted as one HDLC frame.
|
||||||
*/
|
*/
|
||||||
static void n_hdlc_tty_receive(struct tty_struct *tty, const __u8 *data,
|
static void n_hdlc_tty_receive(struct tty_struct *tty, const u8 *data,
|
||||||
const char *flags, int count)
|
const u8 *flags, size_t count)
|
||||||
{
|
{
|
||||||
register struct n_hdlc *n_hdlc = tty->disc_data;
|
register struct n_hdlc *n_hdlc = tty->disc_data;
|
||||||
register struct n_hdlc_buf *buf;
|
register struct n_hdlc_buf *buf;
|
||||||
|
|
||||||
pr_debug("%s() called count=%d\n", __func__, count);
|
pr_debug("%s() called count=%zu\n", __func__, count);
|
||||||
|
|
||||||
if (count > maxframe) {
|
if (count > maxframe) {
|
||||||
pr_debug("rx count>maxframesize, data discarded\n");
|
pr_debug("rx count>maxframesize, data discarded\n");
|
||||||
@ -425,8 +425,8 @@ static void n_hdlc_tty_receive(struct tty_struct *tty, const __u8 *data,
|
|||||||
* Returns the number of bytes returned or error code.
|
* Returns the number of bytes returned or error code.
|
||||||
*/
|
*/
|
||||||
static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file,
|
static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file,
|
||||||
__u8 *kbuf, size_t nr,
|
u8 *kbuf, size_t nr, void **cookie,
|
||||||
void **cookie, unsigned long offset)
|
unsigned long offset)
|
||||||
{
|
{
|
||||||
struct n_hdlc *n_hdlc = tty->disc_data;
|
struct n_hdlc *n_hdlc = tty->disc_data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -518,7 +518,7 @@ done_with_rbuf:
|
|||||||
* Returns the number of bytes written (or error code).
|
* Returns the number of bytes written (or error code).
|
||||||
*/
|
*/
|
||||||
static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
static ssize_t n_hdlc_tty_write(struct tty_struct *tty, struct file *file,
|
||||||
const unsigned char *data, size_t count)
|
const u8 *data, size_t count)
|
||||||
{
|
{
|
||||||
struct n_hdlc *n_hdlc = tty->disc_data;
|
struct n_hdlc *n_hdlc = tty->disc_data;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
@ -10,43 +10,24 @@
|
|||||||
* Copyright (C) Intel 2017
|
* Copyright (C) Intel 2017
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int n_null_open(struct tty_struct *tty)
|
static ssize_t n_null_read(struct tty_struct *tty, struct file *file, u8 *buf,
|
||||||
{
|
size_t nr, void **cookie, unsigned long offset)
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void n_null_close(struct tty_struct *tty)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t n_null_read(struct tty_struct *tty, struct file *file,
|
|
||||||
unsigned char *buf, size_t nr,
|
|
||||||
void **cookie, unsigned long offset)
|
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t n_null_write(struct tty_struct *tty, struct file *file,
|
static ssize_t n_null_write(struct tty_struct *tty, struct file *file,
|
||||||
const unsigned char *buf, size_t nr)
|
const u8 *buf, size_t nr)
|
||||||
{
|
{
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void n_null_receivebuf(struct tty_struct *tty,
|
|
||||||
const unsigned char *cp, const char *fp,
|
|
||||||
int cnt)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct tty_ldisc_ops null_ldisc = {
|
static struct tty_ldisc_ops null_ldisc = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.num = N_NULL,
|
.num = N_NULL,
|
||||||
.name = "n_null",
|
.name = "n_null",
|
||||||
.open = n_null_open,
|
|
||||||
.close = n_null_close,
|
|
||||||
.read = n_null_read,
|
.read = n_null_read,
|
||||||
.write = n_null_write,
|
.write = n_null_write,
|
||||||
.receive_buf = n_null_receivebuf
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init n_null_init(void)
|
static int __init n_null_init(void)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1599,8 +1599,8 @@ static void ntty_hangup(struct tty_struct *tty)
|
|||||||
* called when the userspace process writes to the tty (/dev/noz*).
|
* called when the userspace process writes to the tty (/dev/noz*).
|
||||||
* Data is inserted into a fifo, which is then read and transferred to the modem.
|
* Data is inserted into a fifo, which is then read and transferred to the modem.
|
||||||
*/
|
*/
|
||||||
static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
|
static ssize_t ntty_write(struct tty_struct *tty, const u8 *buffer,
|
||||||
int count)
|
size_t count)
|
||||||
{
|
{
|
||||||
int rval = -EINVAL;
|
int rval = -EINVAL;
|
||||||
struct nozomi *dc = get_dc_by_tty(tty);
|
struct nozomi *dc = get_dc_by_tty(tty);
|
||||||
@ -1610,7 +1610,7 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer,
|
|||||||
if (!dc || !port)
|
if (!dc || !port)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
rval = kfifo_in(&port->fifo_ul, (unsigned char *)buffer, count);
|
rval = kfifo_in(&port->fifo_ul, buffer, count);
|
||||||
|
|
||||||
spin_lock_irqsave(&dc->spin_mutex, flags);
|
spin_lock_irqsave(&dc->spin_mutex, flags);
|
||||||
/* CTS is only valid on the modem channel */
|
/* CTS is only valid on the modem channel */
|
||||||
|
@ -108,7 +108,7 @@ static void pty_unthrottle(struct tty_struct *tty)
|
|||||||
* the other side of the pty/tty pair.
|
* the other side of the pty/tty pair.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
|
static ssize_t pty_write(struct tty_struct *tty, const u8 *buf, size_t c)
|
||||||
{
|
{
|
||||||
struct tty_struct *to = tty->link;
|
struct tty_struct *to = tty->link;
|
||||||
|
|
||||||
|
@ -73,7 +73,8 @@ static void rpmsg_tty_close(struct tty_struct *tty, struct file *filp)
|
|||||||
return tty_port_close(tty->port, tty, filp);
|
return tty_port_close(tty->port, tty, filp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rpmsg_tty_write(struct tty_struct *tty, const u8 *buf, int len)
|
static ssize_t rpmsg_tty_write(struct tty_struct *tty, const u8 *buf,
|
||||||
|
size_t len)
|
||||||
{
|
{
|
||||||
struct rpmsg_tty_port *cport = tty->driver_data;
|
struct rpmsg_tty_port *cport = tty->driver_data;
|
||||||
struct rpmsg_device *rpdev;
|
struct rpmsg_device *rpdev;
|
||||||
@ -86,7 +87,7 @@ static int rpmsg_tty_write(struct tty_struct *tty, const u8 *buf, int len)
|
|||||||
if (msg_max_size < 0)
|
if (msg_max_size < 0)
|
||||||
return msg_max_size;
|
return msg_max_size;
|
||||||
|
|
||||||
msg_size = min(len, msg_max_size);
|
msg_size = min_t(unsigned int, len, msg_max_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use rpmsg_trysend instead of rpmsg_send to send the message so the caller is not
|
* Use rpmsg_trysend instead of rpmsg_send to send the message so the caller is not
|
||||||
|
@ -22,8 +22,8 @@ struct serport {
|
|||||||
* Callback functions from the tty port.
|
* Callback functions from the tty port.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int ttyport_receive_buf(struct tty_port *port, const unsigned char *cp,
|
static size_t ttyport_receive_buf(struct tty_port *port, const u8 *cp,
|
||||||
const unsigned char *fp, size_t count)
|
const u8 *fp, size_t count)
|
||||||
{
|
{
|
||||||
struct serdev_controller *ctrl = port->client_data;
|
struct serdev_controller *ctrl = port->client_data;
|
||||||
struct serport *serport = serdev_controller_get_drvdata(ctrl);
|
struct serport *serport = serdev_controller_get_drvdata(ctrl);
|
||||||
|
@ -117,7 +117,8 @@ static void serial21285_stop_rx(struct uart_port *port)
|
|||||||
static irqreturn_t serial21285_rx_chars(int irq, void *dev_id)
|
static irqreturn_t serial21285_rx_chars(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct uart_port *port = dev_id;
|
struct uart_port *port = dev_id;
|
||||||
unsigned int status, ch, flag, rxs, max_count = 256;
|
unsigned int status, rxs, max_count = 256;
|
||||||
|
u8 ch, flag;
|
||||||
|
|
||||||
status = *CSR_UARTFLG;
|
status = *CSR_UARTFLG;
|
||||||
while (!(status & 0x10) && max_count--) {
|
while (!(status & 0x10) && max_count--) {
|
||||||
|
@ -1042,7 +1042,7 @@ static int brcmuart_probe(struct platform_device *pdev)
|
|||||||
dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
|
dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
|
||||||
|
|
||||||
memset(&up, 0, sizeof(up));
|
memset(&up, 0, sizeof(up));
|
||||||
up.port.type = PORT_16550A;
|
up.port.type = PORT_BCM7271;
|
||||||
up.port.uartclk = clk_rate;
|
up.port.uartclk = clk_rate;
|
||||||
up.port.dev = dev;
|
up.port.dev = dev;
|
||||||
up.port.mapbase = mapbase;
|
up.port.mapbase = mapbase;
|
||||||
@ -1056,8 +1056,6 @@ static int brcmuart_probe(struct platform_device *pdev)
|
|||||||
| UPF_FIXED_PORT | UPF_FIXED_TYPE;
|
| UPF_FIXED_PORT | UPF_FIXED_TYPE;
|
||||||
up.port.dev = dev;
|
up.port.dev = dev;
|
||||||
up.port.private_data = priv;
|
up.port.private_data = priv;
|
||||||
up.capabilities = UART_CAP_FIFO | UART_CAP_AFE;
|
|
||||||
up.port.fifosize = 32;
|
|
||||||
|
|
||||||
/* Check for a fixed line number */
|
/* Check for a fixed line number */
|
||||||
ret = of_alias_get_id(np, "serial");
|
ret = of_alias_get_id(np, "serial");
|
||||||
|
@ -523,7 +523,10 @@ static int dw8250_probe(struct platform_device *pdev)
|
|||||||
if (!regs)
|
if (!regs)
|
||||||
return dev_err_probe(dev, -EINVAL, "no registers defined\n");
|
return dev_err_probe(dev, -EINVAL, "no registers defined\n");
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq_optional(pdev, 0);
|
||||||
|
/* no interrupt -> fall back to polling */
|
||||||
|
if (irq == -ENXIO)
|
||||||
|
irq = 0;
|
||||||
if (irq < 0)
|
if (irq < 0)
|
||||||
return irq;
|
return irq;
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/serial_reg.h>
|
#include <linux/serial_reg.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
|
@ -12,11 +12,42 @@
|
|||||||
#define MEN_UART_ID_Z057 0x39
|
#define MEN_UART_ID_Z057 0x39
|
||||||
#define MEN_UART_ID_Z125 0x7d
|
#define MEN_UART_ID_Z125 0x7d
|
||||||
|
|
||||||
#define MEN_UART_MEM_SIZE 0x10
|
/*
|
||||||
|
* IP Cores Z025 and Z057 can have up to 4 UART
|
||||||
|
* The UARTs available are stored in a global
|
||||||
|
* register saved in physical address + 0x40
|
||||||
|
* Is saved as follows:
|
||||||
|
*
|
||||||
|
* 7 0
|
||||||
|
* +------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|
* |UART4 | UART3 | UART2 | UART1 | U4irq | U3irq | U2irq | U1irq |
|
||||||
|
* +------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
|
*/
|
||||||
|
#define MEN_UART1_MASK 0x01
|
||||||
|
#define MEN_UART2_MASK 0x02
|
||||||
|
#define MEN_UART3_MASK 0x04
|
||||||
|
#define MEN_UART4_MASK 0x08
|
||||||
|
|
||||||
|
#define MEN_Z125_UARTS_AVAILABLE 0x01
|
||||||
|
|
||||||
|
#define MEN_Z025_MAX_UARTS 4
|
||||||
|
#define MEN_UART_MEM_SIZE 0x10
|
||||||
|
#define MEM_UART_REGISTER_SIZE 0x01
|
||||||
|
#define MEN_Z025_REGISTER_OFFSET 0x40
|
||||||
|
|
||||||
|
#define MEN_UART1_OFFSET 0
|
||||||
|
#define MEN_UART2_OFFSET (MEN_UART1_OFFSET + MEN_UART_MEM_SIZE)
|
||||||
|
#define MEN_UART3_OFFSET (MEN_UART2_OFFSET + MEN_UART_MEM_SIZE)
|
||||||
|
#define MEN_UART4_OFFSET (MEN_UART3_OFFSET + MEN_UART_MEM_SIZE)
|
||||||
|
|
||||||
|
#define MEN_READ_REGISTER(addr) readb(addr)
|
||||||
|
|
||||||
|
#define MAX_PORTS 4
|
||||||
|
|
||||||
struct serial_8250_men_mcb_data {
|
struct serial_8250_men_mcb_data {
|
||||||
struct uart_8250_port uart;
|
int num_ports;
|
||||||
int line;
|
int line[MAX_PORTS];
|
||||||
|
unsigned int offset[MAX_PORTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -37,10 +68,10 @@ static u32 men_lookup_uartclk(struct mcb_device *mdev)
|
|||||||
clkval = 1041666;
|
clkval = 1041666;
|
||||||
else if (strncmp(mdev->bus->name, "F216", 4) == 0)
|
else if (strncmp(mdev->bus->name, "F216", 4) == 0)
|
||||||
clkval = 1843200;
|
clkval = 1843200;
|
||||||
else if (strncmp(mdev->bus->name, "G215", 4) == 0)
|
|
||||||
clkval = 1843200;
|
|
||||||
else if (strncmp(mdev->bus->name, "F210", 4) == 0)
|
else if (strncmp(mdev->bus->name, "F210", 4) == 0)
|
||||||
clkval = 115200;
|
clkval = 115200;
|
||||||
|
else if (strstr(mdev->bus->name, "215"))
|
||||||
|
clkval = 1843200;
|
||||||
else
|
else
|
||||||
dev_info(&mdev->dev,
|
dev_info(&mdev->dev,
|
||||||
"board not detected, using default uartclk\n");
|
"board not detected, using default uartclk\n");
|
||||||
@ -50,16 +81,98 @@ static u32 men_lookup_uartclk(struct mcb_device *mdev)
|
|||||||
return clkval;
|
return clkval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_num_ports(struct mcb_device *mdev,
|
static int read_uarts_available_from_register(struct resource *mem_res,
|
||||||
void __iomem *membase)
|
u8 *uarts_available)
|
||||||
|
{
|
||||||
|
void __iomem *mem;
|
||||||
|
int reg_value;
|
||||||
|
|
||||||
|
if (!request_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
|
||||||
|
MEM_UART_REGISTER_SIZE, KBUILD_MODNAME)) {
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
mem = ioremap(mem_res->start + MEN_Z025_REGISTER_OFFSET,
|
||||||
|
MEM_UART_REGISTER_SIZE);
|
||||||
|
if (!mem) {
|
||||||
|
release_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
|
||||||
|
MEM_UART_REGISTER_SIZE);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
reg_value = MEN_READ_REGISTER(mem);
|
||||||
|
|
||||||
|
iounmap(mem);
|
||||||
|
|
||||||
|
release_mem_region(mem_res->start + MEN_Z025_REGISTER_OFFSET,
|
||||||
|
MEM_UART_REGISTER_SIZE);
|
||||||
|
|
||||||
|
*uarts_available = reg_value >> 4;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_serial_data(struct mcb_device *mdev,
|
||||||
|
struct resource *mem_res,
|
||||||
|
struct serial_8250_men_mcb_data *serial_data)
|
||||||
|
{
|
||||||
|
u8 uarts_available;
|
||||||
|
int count = 0;
|
||||||
|
int mask;
|
||||||
|
int res;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
res = read_uarts_available_from_register(mem_res, &uarts_available);
|
||||||
|
if (res < 0)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_PORTS; i++) {
|
||||||
|
mask = 0x1 << i;
|
||||||
|
switch (uarts_available & mask) {
|
||||||
|
case MEN_UART1_MASK:
|
||||||
|
serial_data->offset[count] = MEN_UART1_OFFSET;
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
case MEN_UART2_MASK:
|
||||||
|
serial_data->offset[count] = MEN_UART2_OFFSET;
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
case MEN_UART3_MASK:
|
||||||
|
serial_data->offset[count] = MEN_UART3_OFFSET;
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
case MEN_UART4_MASK:
|
||||||
|
serial_data->offset[count] = MEN_UART4_OFFSET;
|
||||||
|
count++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count <= 0 || count > MAX_PORTS) {
|
||||||
|
dev_err(&mdev->dev, "unexpected number of ports: %u\n",
|
||||||
|
count);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
serial_data->num_ports = count;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_serial_data(struct mcb_device *mdev,
|
||||||
|
struct resource *mem_res,
|
||||||
|
struct serial_8250_men_mcb_data *serial_data)
|
||||||
{
|
{
|
||||||
switch (mdev->id) {
|
switch (mdev->id) {
|
||||||
case MEN_UART_ID_Z125:
|
case MEN_UART_ID_Z125:
|
||||||
return 1U;
|
serial_data->num_ports = 1;
|
||||||
|
serial_data->offset[0] = 0;
|
||||||
|
return 0;
|
||||||
case MEN_UART_ID_Z025:
|
case MEN_UART_ID_Z025:
|
||||||
return readb(membase) >> 4;
|
|
||||||
case MEN_UART_ID_Z057:
|
case MEN_UART_ID_Z057:
|
||||||
return 4U;
|
return read_serial_data(mdev, mem_res, serial_data);
|
||||||
default:
|
default:
|
||||||
dev_err(&mdev->dev, "no supported device!\n");
|
dev_err(&mdev->dev, "no supported device!\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -69,62 +182,54 @@ static int get_num_ports(struct mcb_device *mdev,
|
|||||||
static int serial_8250_men_mcb_probe(struct mcb_device *mdev,
|
static int serial_8250_men_mcb_probe(struct mcb_device *mdev,
|
||||||
const struct mcb_device_id *id)
|
const struct mcb_device_id *id)
|
||||||
{
|
{
|
||||||
|
struct uart_8250_port uart;
|
||||||
struct serial_8250_men_mcb_data *data;
|
struct serial_8250_men_mcb_data *data;
|
||||||
struct resource *mem;
|
struct resource *mem;
|
||||||
int num_ports;
|
|
||||||
int i;
|
int i;
|
||||||
void __iomem *membase;
|
int res;
|
||||||
|
|
||||||
mem = mcb_get_resource(mdev, IORESOURCE_MEM);
|
mem = mcb_get_resource(mdev, IORESOURCE_MEM);
|
||||||
if (mem == NULL)
|
if (mem == NULL)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
membase = devm_ioremap_resource(&mdev->dev, mem);
|
|
||||||
if (IS_ERR(membase))
|
|
||||||
return PTR_ERR_OR_ZERO(membase);
|
|
||||||
|
|
||||||
num_ports = get_num_ports(mdev, membase);
|
data = devm_kzalloc(&mdev->dev,
|
||||||
|
|
||||||
dev_dbg(&mdev->dev, "found a 16z%03u with %u ports\n",
|
|
||||||
mdev->id, num_ports);
|
|
||||||
|
|
||||||
if (num_ports <= 0 || num_ports > 4) {
|
|
||||||
dev_err(&mdev->dev, "unexpected number of ports: %u\n",
|
|
||||||
num_ports);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = devm_kcalloc(&mdev->dev, num_ports,
|
|
||||||
sizeof(struct serial_8250_men_mcb_data),
|
sizeof(struct serial_8250_men_mcb_data),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
res = init_serial_data(mdev, mem, data);
|
||||||
|
if (res < 0)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
dev_dbg(&mdev->dev, "found a 16z%03u with %u ports\n",
|
||||||
|
mdev->id, data->num_ports);
|
||||||
|
|
||||||
mcb_set_drvdata(mdev, data);
|
mcb_set_drvdata(mdev, data);
|
||||||
|
|
||||||
for (i = 0; i < num_ports; i++) {
|
for (i = 0; i < data->num_ports; i++) {
|
||||||
data[i].uart.port.dev = mdev->dma_dev;
|
memset(&uart, 0, sizeof(struct uart_8250_port));
|
||||||
spin_lock_init(&data[i].uart.port.lock);
|
spin_lock_init(&uart.port.lock);
|
||||||
|
|
||||||
data[i].uart.port.type = PORT_16550;
|
uart.port.flags = UPF_SKIP_TEST |
|
||||||
data[i].uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ
|
UPF_SHARE_IRQ |
|
||||||
| UPF_FIXED_TYPE;
|
UPF_BOOT_AUTOCONF |
|
||||||
data[i].uart.port.iotype = UPIO_MEM;
|
UPF_IOREMAP;
|
||||||
data[i].uart.port.uartclk = men_lookup_uartclk(mdev);
|
uart.port.iotype = UPIO_MEM;
|
||||||
data[i].uart.port.regshift = 0;
|
uart.port.uartclk = men_lookup_uartclk(mdev);
|
||||||
data[i].uart.port.irq = mcb_get_irq(mdev);
|
uart.port.irq = mcb_get_irq(mdev);
|
||||||
data[i].uart.port.membase = membase;
|
uart.port.mapbase = (unsigned long) mem->start
|
||||||
data[i].uart.port.fifosize = 60;
|
+ data->offset[i];
|
||||||
data[i].uart.port.mapbase = (unsigned long) mem->start
|
|
||||||
+ i * MEN_UART_MEM_SIZE;
|
|
||||||
data[i].uart.port.iobase = data[i].uart.port.mapbase;
|
|
||||||
|
|
||||||
/* ok, register the port */
|
/* ok, register the port */
|
||||||
data[i].line = serial8250_register_8250_port(&data[i].uart);
|
res = serial8250_register_8250_port(&uart);
|
||||||
if (data[i].line < 0) {
|
if (res < 0) {
|
||||||
dev_err(&mdev->dev, "unable to register UART port\n");
|
dev_err(&mdev->dev, "unable to register UART port\n");
|
||||||
return data[i].line;
|
return res;
|
||||||
}
|
}
|
||||||
dev_info(&mdev->dev, "found MCB UART: ttyS%d\n", data[i].line);
|
|
||||||
|
data->line[i] = res;
|
||||||
|
dev_info(&mdev->dev, "found MCB UART: ttyS%d\n", data->line[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -132,20 +237,14 @@ static int serial_8250_men_mcb_probe(struct mcb_device *mdev,
|
|||||||
|
|
||||||
static void serial_8250_men_mcb_remove(struct mcb_device *mdev)
|
static void serial_8250_men_mcb_remove(struct mcb_device *mdev)
|
||||||
{
|
{
|
||||||
int num_ports, i;
|
int i;
|
||||||
struct serial_8250_men_mcb_data *data = mcb_get_drvdata(mdev);
|
struct serial_8250_men_mcb_data *data = mcb_get_drvdata(mdev);
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
num_ports = get_num_ports(mdev, data[0].uart.port.membase);
|
for (i = 0; i < data->num_ports; i++)
|
||||||
if (num_ports <= 0 || num_ports > 4) {
|
serial8250_unregister_port(data->line[i]);
|
||||||
dev_err(&mdev->dev, "error retrieving number of ports!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < num_ports; i++)
|
|
||||||
serial8250_unregister_port(data[i].line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct mcb_device_id serial_8250_men_mcb_ids[] = {
|
static const struct mcb_device_id serial_8250_men_mcb_ids[] = {
|
||||||
@ -159,7 +258,6 @@ MODULE_DEVICE_TABLE(mcb, serial_8250_men_mcb_ids);
|
|||||||
static struct mcb_driver mcb_driver = {
|
static struct mcb_driver mcb_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "8250_men_mcb",
|
.name = "8250_men_mcb",
|
||||||
.owner = THIS_MODULE,
|
|
||||||
},
|
},
|
||||||
.probe = serial_8250_men_mcb_probe,
|
.probe = serial_8250_men_mcb_probe,
|
||||||
.remove = serial_8250_men_mcb_remove,
|
.remove = serial_8250_men_mcb_remove,
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
@ -67,6 +67,8 @@ static const struct pci_device_id pci_use_msi[] = {
|
|||||||
0xA000, 0x1000) },
|
0xA000, 0x1000) },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
|
||||||
0xA000, 0x1000) },
|
0xA000, 0x1000) },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
|
||||||
|
0xA000, 0x1000) },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
|
||||||
PCI_ANY_ID, PCI_ANY_ID) },
|
PCI_ANY_ID, PCI_ANY_ID) },
|
||||||
{ }
|
{ }
|
||||||
@ -5557,6 +5559,14 @@ static const struct pci_device_id serial_pci_tbl[] = {
|
|||||||
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9865,
|
||||||
0xA000, 0x3004,
|
0xA000, 0x3004,
|
||||||
0, 0, pbn_b0_bt_4_115200 },
|
0, 0, pbn_b0_bt_4_115200 },
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ASIX AX99100 PCIe to Multi I/O Controller
|
||||||
|
*/
|
||||||
|
{ PCI_VENDOR_ID_ASIX, PCI_DEVICE_ID_ASIX_AX99100,
|
||||||
|
0xA000, 0x1000,
|
||||||
|
0, 0, pbn_b0_1_115200 },
|
||||||
|
|
||||||
/* Intel CE4100 */
|
/* Intel CE4100 */
|
||||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
|
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CE4100_UART,
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||||
|
@ -322,6 +322,14 @@ static const struct serial8250_config uart_config[] = {
|
|||||||
.rxtrig_bytes = {2, 66, 130, 194},
|
.rxtrig_bytes = {2, 66, 130, 194},
|
||||||
.flags = UART_CAP_FIFO,
|
.flags = UART_CAP_FIFO,
|
||||||
},
|
},
|
||||||
|
[PORT_BCM7271] = {
|
||||||
|
.name = "Broadcom BCM7271 UART",
|
||||||
|
.fifo_size = 32,
|
||||||
|
.tx_loadsz = 32,
|
||||||
|
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01,
|
||||||
|
.rxtrig_bytes = {1, 8, 16, 30},
|
||||||
|
.flags = UART_CAP_FIFO | UART_CAP_AFE,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Uart divisor latch read */
|
/* Uart divisor latch read */
|
||||||
@ -1703,8 +1711,7 @@ static void serial8250_enable_ms(struct uart_port *port)
|
|||||||
void serial8250_read_char(struct uart_8250_port *up, u16 lsr)
|
void serial8250_read_char(struct uart_8250_port *up, u16 lsr)
|
||||||
{
|
{
|
||||||
struct uart_port *port = &up->port;
|
struct uart_port *port = &up->port;
|
||||||
unsigned char ch;
|
u8 ch, flag = TTY_NORMAL;
|
||||||
char flag = TTY_NORMAL;
|
|
||||||
|
|
||||||
if (likely(lsr & UART_LSR_DR))
|
if (likely(lsr & UART_LSR_DR))
|
||||||
ch = serial_in(up, UART_RX);
|
ch = serial_in(up, UART_RX);
|
||||||
|
@ -183,6 +183,7 @@ static int __init early_serial_pxa_setup(struct earlycon_device *device,
|
|||||||
return early_serial8250_setup(device, NULL);
|
return early_serial8250_setup(device, NULL);
|
||||||
}
|
}
|
||||||
OF_EARLYCON_DECLARE(early_pxa, "mrvl,pxa-uart", early_serial_pxa_setup);
|
OF_EARLYCON_DECLARE(early_pxa, "mrvl,pxa-uart", early_serial_pxa_setup);
|
||||||
|
OF_EARLYCON_DECLARE(mmp, "mrvl,mmp-uart", early_serial_pxa_setup);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MODULE_AUTHOR("Sergei Ianovich");
|
MODULE_AUTHOR("Sergei Ianovich");
|
||||||
|
@ -41,7 +41,7 @@ obj-$(CONFIG_SERIAL_HS_LPC32XX) += lpc32xx_hs.o
|
|||||||
obj-$(CONFIG_SERIAL_DZ) += dz.o
|
obj-$(CONFIG_SERIAL_DZ) += dz.o
|
||||||
obj-$(CONFIG_SERIAL_ZS) += zs.o
|
obj-$(CONFIG_SERIAL_ZS) += zs.o
|
||||||
obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
|
obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
|
||||||
obj-$(CONFIG_SERIAL_CPM) += cpm_uart/
|
obj-$(CONFIG_SERIAL_CPM) += cpm_uart.o
|
||||||
obj-$(CONFIG_SERIAL_IMX) += imx.o
|
obj-$(CONFIG_SERIAL_IMX) += imx.o
|
||||||
obj-$(CONFIG_SERIAL_IMX_EARLYCON) += imx_earlycon.o
|
obj-$(CONFIG_SERIAL_IMX_EARLYCON) += imx_earlycon.o
|
||||||
obj-$(CONFIG_SERIAL_MPC52xx) += mpc52xx_uart.o
|
obj-$(CONFIG_SERIAL_MPC52xx) += mpc52xx_uart.o
|
||||||
|
@ -110,8 +110,8 @@ static void altera_jtaguart_set_termios(struct uart_port *port,
|
|||||||
|
|
||||||
static void altera_jtaguart_rx_chars(struct uart_port *port)
|
static void altera_jtaguart_rx_chars(struct uart_port *port)
|
||||||
{
|
{
|
||||||
unsigned char ch;
|
u32 status;
|
||||||
unsigned long status;
|
u8 ch;
|
||||||
|
|
||||||
while ((status = readl(port->membase + ALTERA_JTAGUART_DATA_REG)) &
|
while ((status = readl(port->membase + ALTERA_JTAGUART_DATA_REG)) &
|
||||||
ALTERA_JTAGUART_DATA_RVALID_MSK) {
|
ALTERA_JTAGUART_DATA_RVALID_MSK) {
|
||||||
|
@ -201,8 +201,8 @@ static void altera_uart_set_termios(struct uart_port *port,
|
|||||||
|
|
||||||
static void altera_uart_rx_chars(struct uart_port *port)
|
static void altera_uart_rx_chars(struct uart_port *port)
|
||||||
{
|
{
|
||||||
unsigned char ch, flag;
|
|
||||||
unsigned short status;
|
unsigned short status;
|
||||||
|
u8 ch, flag;
|
||||||
|
|
||||||
while ((status = altera_uart_readl(port, ALTERA_UART_STATUS_REG)) &
|
while ((status = altera_uart_readl(port, ALTERA_UART_STATUS_REG)) &
|
||||||
ALTERA_UART_STATUS_RRDY_MSK) {
|
ALTERA_UART_STATUS_RRDY_MSK) {
|
||||||
|
@ -112,7 +112,8 @@ static void pl010_enable_ms(struct uart_port *port)
|
|||||||
|
|
||||||
static void pl010_rx_chars(struct uart_port *port)
|
static void pl010_rx_chars(struct uart_port *port)
|
||||||
{
|
{
|
||||||
unsigned int status, ch, flag, rsr, max_count = 256;
|
unsigned int status, rsr, max_count = 256;
|
||||||
|
u8 ch, flag;
|
||||||
|
|
||||||
status = readb(port->membase + UART01x_FR);
|
status = readb(port->membase + UART01x_FR);
|
||||||
while (UART_RX_DATA(status) && max_count--) {
|
while (UART_RX_DATA(status) && max_count--) {
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sysrq.h>
|
#include <linux/sysrq.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
@ -36,7 +37,6 @@
|
|||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/pinctrl/consumer.h>
|
#include <linux/pinctrl/consumer.h>
|
||||||
#include <linux/sizes.h>
|
#include <linux/sizes.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
@ -307,9 +307,10 @@ static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
|
|||||||
*/
|
*/
|
||||||
static int pl011_fifo_to_tty(struct uart_amba_port *uap)
|
static int pl011_fifo_to_tty(struct uart_amba_port *uap)
|
||||||
{
|
{
|
||||||
unsigned int ch, flag, fifotaken;
|
unsigned int ch, fifotaken;
|
||||||
int sysrq;
|
int sysrq;
|
||||||
u16 status;
|
u16 status;
|
||||||
|
u8 flag;
|
||||||
|
|
||||||
for (fifotaken = 0; fifotaken != 256; fifotaken++) {
|
for (fifotaken = 0; fifotaken != 256; fifotaken++) {
|
||||||
status = pl011_read(uap, REG_FR);
|
status = pl011_read(uap, REG_FR);
|
||||||
|
@ -22,9 +22,6 @@
|
|||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/of_platform.h>
|
|
||||||
#include <linux/of_irq.h>
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
@ -70,8 +67,9 @@ static void apbuart_stop_rx(struct uart_port *port)
|
|||||||
|
|
||||||
static void apbuart_rx_chars(struct uart_port *port)
|
static void apbuart_rx_chars(struct uart_port *port)
|
||||||
{
|
{
|
||||||
unsigned int status, ch, rsr, flag;
|
unsigned int status, rsr;
|
||||||
unsigned int max_chars = port->fifosize;
|
unsigned int max_chars = port->fifosize;
|
||||||
|
u8 ch, flag;
|
||||||
|
|
||||||
status = UART_GET_STATUS(port);
|
status = UART_GET_STATUS(port);
|
||||||
|
|
||||||
|
@ -749,8 +749,7 @@ static int ar933x_uart_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
port = &up->port;
|
port = &up->port;
|
||||||
|
|
||||||
mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &mem_res);
|
||||||
port->membase = devm_ioremap_resource(&pdev->dev, mem_res);
|
|
||||||
if (IS_ERR(port->membase))
|
if (IS_ERR(port->membase))
|
||||||
return PTR_ERR(port->membase);
|
return PTR_ERR(port->membase);
|
||||||
|
|
||||||
|
@ -195,8 +195,6 @@ static void arc_serial_start_tx(struct uart_port *port)
|
|||||||
|
|
||||||
static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
|
static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
|
||||||
{
|
{
|
||||||
unsigned int ch, flg = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* UART has 4 deep RX-FIFO. Driver's recongnition of this fact
|
* UART has 4 deep RX-FIFO. Driver's recongnition of this fact
|
||||||
* is very subtle. Here's how ...
|
* is very subtle. Here's how ...
|
||||||
@ -207,24 +205,23 @@ static void arc_serial_rx_chars(struct uart_port *port, unsigned int status)
|
|||||||
* controller, which is indeed the Rx-FIFO.
|
* controller, which is indeed the Rx-FIFO.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
|
u8 ch, flg = TTY_NORMAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This could be an Rx Intr for err (no data),
|
* This could be an Rx Intr for err (no data),
|
||||||
* so check err and clear that Intr first
|
* so check err and clear that Intr first
|
||||||
*/
|
*/
|
||||||
if (unlikely(status & (RXOERR | RXFERR))) {
|
if (status & RXOERR) {
|
||||||
if (status & RXOERR) {
|
port->icount.overrun++;
|
||||||
port->icount.overrun++;
|
flg = TTY_OVERRUN;
|
||||||
flg = TTY_OVERRUN;
|
UART_CLR_STATUS(port, RXOERR);
|
||||||
UART_CLR_STATUS(port, RXOERR);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (status & RXFERR) {
|
if (status & RXFERR) {
|
||||||
port->icount.frame++;
|
port->icount.frame++;
|
||||||
flg = TTY_FRAME;
|
flg = TTY_FRAME;
|
||||||
UART_CLR_STATUS(port, RXFERR);
|
UART_CLR_STATUS(port, RXFERR);
|
||||||
}
|
}
|
||||||
} else
|
|
||||||
flg = TTY_NORMAL;
|
|
||||||
|
|
||||||
if (status & RXEMPTY)
|
if (status & RXEMPTY)
|
||||||
continue;
|
continue;
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include <linux/tty_flip.h>
|
#include <linux/tty_flip.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#include <linux/atmel_pdc.h>
|
#include <linux/atmel_pdc.h>
|
||||||
@ -1516,8 +1515,8 @@ static void atmel_rx_from_ring(struct uart_port *port)
|
|||||||
{
|
{
|
||||||
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
|
||||||
struct circ_buf *ring = &atmel_port->rx_ring;
|
struct circ_buf *ring = &atmel_port->rx_ring;
|
||||||
unsigned int flg;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
u8 flg;
|
||||||
|
|
||||||
while (ring->head != ring->tail) {
|
while (ring->head != ring->tail) {
|
||||||
struct atmel_uart_char c;
|
struct atmel_uart_char c;
|
||||||
|
@ -832,14 +832,10 @@ static int bcm_uart_probe(struct platform_device *pdev)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
memset(port, 0, sizeof(*port));
|
memset(port, 0, sizeof(*port));
|
||||||
|
|
||||||
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res_mem);
|
||||||
if (!res_mem)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
port->mapbase = res_mem->start;
|
|
||||||
port->membase = devm_ioremap_resource(&pdev->dev, res_mem);
|
|
||||||
if (IS_ERR(port->membase))
|
if (IS_ERR(port->membase))
|
||||||
return PTR_ERR(port->membase);
|
return PTR_ERR(port->membase);
|
||||||
|
port->mapbase = res_mem->start;
|
||||||
|
|
||||||
ret = platform_get_irq(pdev, 0);
|
ret = platform_get_irq(pdev, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -92,8 +92,9 @@ static irqreturn_t uart_clps711x_int_rx(int irq, void *dev_id)
|
|||||||
{
|
{
|
||||||
struct uart_port *port = dev_id;
|
struct uart_port *port = dev_id;
|
||||||
struct clps711x_port *s = dev_get_drvdata(port->dev);
|
struct clps711x_port *s = dev_get_drvdata(port->dev);
|
||||||
unsigned int status, flg;
|
unsigned int status;
|
||||||
u16 ch;
|
u16 ch;
|
||||||
|
u8 flg;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
u32 sysflg = 0;
|
u32 sysflg = 0;
|
||||||
@ -450,8 +451,7 @@ static int uart_clps711x_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(uart_clk))
|
if (IS_ERR(uart_clk))
|
||||||
return PTR_ERR(uart_clk);
|
return PTR_ERR(uart_clk);
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
s->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
s->port.membase = devm_ioremap_resource(&pdev->dev, res);
|
|
||||||
if (IS_ERR(s->port.membase))
|
if (IS_ERR(s->port.membase))
|
||||||
return PTR_ERR(s->port.membase);
|
return PTR_ERR(s->port.membase);
|
||||||
|
|
||||||
|
@ -26,17 +26,17 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/fs_uart_pd.h>
|
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/gpio/consumer.h>
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
||||||
|
#include <sysdev/fsl_soc.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/fs_pd.h>
|
|
||||||
#include <asm/udbg.h>
|
#include <asm/udbg.h>
|
||||||
|
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
@ -48,14 +48,17 @@
|
|||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
static int cpm_uart_tx_pump(struct uart_port *port);
|
static int cpm_uart_tx_pump(struct uart_port *port);
|
||||||
static void cpm_uart_init_smc(struct uart_cpm_port *pinfo);
|
|
||||||
static void cpm_uart_init_scc(struct uart_cpm_port *pinfo);
|
|
||||||
static void cpm_uart_initbd(struct uart_cpm_port *pinfo);
|
static void cpm_uart_initbd(struct uart_cpm_port *pinfo);
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
#define HW_BUF_SPD_THRESHOLD 2400
|
#define HW_BUF_SPD_THRESHOLD 2400
|
||||||
|
|
||||||
|
static void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
|
||||||
|
{
|
||||||
|
cpm_command(port->command, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check, if transmit buffers are processed
|
* Check, if transmit buffers are processed
|
||||||
*/
|
*/
|
||||||
@ -605,7 +608,7 @@ static void cpm_uart_set_termios(struct uart_port *port,
|
|||||||
if (pinfo->clk)
|
if (pinfo->clk)
|
||||||
clk_set_rate(pinfo->clk, baud);
|
clk_set_rate(pinfo->clk, baud);
|
||||||
else
|
else
|
||||||
cpm_set_brg(pinfo->brg - 1, baud);
|
cpm_setbrg(pinfo->brg - 1, baud);
|
||||||
spin_unlock_irqrestore(&port->lock, flags);
|
spin_unlock_irqrestore(&port->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,7 +774,8 @@ static void cpm_uart_init_scc(struct uart_cpm_port *pinfo)
|
|||||||
* parameter ram.
|
* parameter ram.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
cpm_set_scc_fcr(sup);
|
out_8(&sup->scc_genscc.scc_rfcr, CPMFCR_GBL | CPMFCR_EB);
|
||||||
|
out_8(&sup->scc_genscc.scc_tfcr, CPMFCR_GBL | CPMFCR_EB);
|
||||||
|
|
||||||
out_be16(&sup->scc_genscc.scc_mrblr, pinfo->rx_fifosize);
|
out_be16(&sup->scc_genscc.scc_mrblr, pinfo->rx_fifosize);
|
||||||
out_be16(&sup->scc_maxidl, 0x10);
|
out_be16(&sup->scc_maxidl, 0x10);
|
||||||
@ -842,7 +846,8 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
|
|||||||
/* Set up the uart parameters in the
|
/* Set up the uart parameters in the
|
||||||
* parameter ram.
|
* parameter ram.
|
||||||
*/
|
*/
|
||||||
cpm_set_smc_fcr(up);
|
out_8(&up->smc_rfcr, CPMFCR_GBL | CPMFCR_EB);
|
||||||
|
out_8(&up->smc_tfcr, CPMFCR_GBL | CPMFCR_EB);
|
||||||
|
|
||||||
/* Using idle character time requires some additional tuning. */
|
/* Using idle character time requires some additional tuning. */
|
||||||
out_be16(&up->smc_mrblr, pinfo->rx_fifosize);
|
out_be16(&up->smc_mrblr, pinfo->rx_fifosize);
|
||||||
@ -863,6 +868,78 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
|
|||||||
setbits16(&sp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
|
setbits16(&sp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate DP-Ram and memory buffers. We need to allocate a transmit and
|
||||||
|
* receive buffer descriptors from dual port ram, and a character
|
||||||
|
* buffer area from host mem. If we are allocating for the console we need
|
||||||
|
* to do it from bootmem
|
||||||
|
*/
|
||||||
|
static int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
|
||||||
|
{
|
||||||
|
int dpmemsz, memsz;
|
||||||
|
u8 __iomem *dp_mem;
|
||||||
|
unsigned long dp_offset;
|
||||||
|
u8 *mem_addr;
|
||||||
|
dma_addr_t dma_addr = 0;
|
||||||
|
|
||||||
|
pr_debug("CPM uart[%d]:allocbuf\n", pinfo->port.line);
|
||||||
|
|
||||||
|
dpmemsz = sizeof(cbd_t) * (pinfo->rx_nrfifos + pinfo->tx_nrfifos);
|
||||||
|
dp_offset = cpm_muram_alloc(dpmemsz, 8);
|
||||||
|
if (IS_ERR_VALUE(dp_offset)) {
|
||||||
|
pr_err("%s: could not allocate buffer descriptors\n", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
dp_mem = cpm_muram_addr(dp_offset);
|
||||||
|
|
||||||
|
memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) +
|
||||||
|
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
|
||||||
|
if (IS_ENABLED(CONFIG_CPM1) && is_con) {
|
||||||
|
/* was hostalloc but changed cause it blows away the */
|
||||||
|
/* large tlb mapping when pinning the kernel area */
|
||||||
|
mem_addr = (u8 __force *)cpm_muram_addr(cpm_muram_alloc(memsz, 8));
|
||||||
|
dma_addr = cpm_muram_dma((void __iomem *)mem_addr);
|
||||||
|
} else if (is_con) {
|
||||||
|
mem_addr = kzalloc(memsz, GFP_NOWAIT);
|
||||||
|
dma_addr = virt_to_bus(mem_addr);
|
||||||
|
} else {
|
||||||
|
mem_addr = dma_alloc_coherent(pinfo->port.dev, memsz, &dma_addr,
|
||||||
|
GFP_KERNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mem_addr) {
|
||||||
|
cpm_muram_free(dp_offset);
|
||||||
|
pr_err("%s: could not allocate coherent memory\n", __func__);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
pinfo->dp_addr = dp_offset;
|
||||||
|
pinfo->mem_addr = mem_addr;
|
||||||
|
pinfo->dma_addr = dma_addr;
|
||||||
|
pinfo->mem_size = memsz;
|
||||||
|
|
||||||
|
pinfo->rx_buf = mem_addr;
|
||||||
|
pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
|
||||||
|
* pinfo->rx_fifosize);
|
||||||
|
|
||||||
|
pinfo->rx_bd_base = (cbd_t __iomem *)dp_mem;
|
||||||
|
pinfo->tx_bd_base = pinfo->rx_bd_base + pinfo->rx_nrfifos;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
|
||||||
|
{
|
||||||
|
dma_free_coherent(pinfo->port.dev, L1_CACHE_ALIGN(pinfo->rx_nrfifos *
|
||||||
|
pinfo->rx_fifosize) +
|
||||||
|
L1_CACHE_ALIGN(pinfo->tx_nrfifos *
|
||||||
|
pinfo->tx_fifosize), (void __force *)pinfo->mem_addr,
|
||||||
|
pinfo->dma_addr);
|
||||||
|
|
||||||
|
cpm_muram_free(pinfo->dp_addr);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize port. This is called from early_console stuff
|
* Initialize port. This is called from early_console stuff
|
||||||
* so we have to be careful here !
|
* so we have to be careful here !
|
||||||
@ -1128,7 +1205,55 @@ static const struct uart_ops cpm_uart_pops = {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct uart_cpm_port cpm_uart_ports[UART_NR];
|
static struct uart_cpm_port cpm_uart_ports[UART_NR];
|
||||||
|
|
||||||
|
static void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
|
||||||
|
struct device_node *np)
|
||||||
|
{
|
||||||
|
void __iomem *pram;
|
||||||
|
unsigned long offset;
|
||||||
|
struct resource res;
|
||||||
|
resource_size_t len;
|
||||||
|
|
||||||
|
/* Don't remap parameter RAM if it has already been initialized
|
||||||
|
* during console setup.
|
||||||
|
*/
|
||||||
|
if (IS_SMC(port) && port->smcup)
|
||||||
|
return port->smcup;
|
||||||
|
else if (!IS_SMC(port) && port->sccup)
|
||||||
|
return port->sccup;
|
||||||
|
|
||||||
|
if (of_address_to_resource(np, 1, &res))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
len = resource_size(&res);
|
||||||
|
pram = ioremap(res.start, len);
|
||||||
|
if (!pram)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_CPM2) || !IS_SMC(port))
|
||||||
|
return pram;
|
||||||
|
|
||||||
|
if (len != 2) {
|
||||||
|
pr_warn("cpm_uart[%d]: device tree references "
|
||||||
|
"SMC pram, using boot loader/wrapper pram mapping. "
|
||||||
|
"Please fix your device tree to reference the pram "
|
||||||
|
"base register instead.\n",
|
||||||
|
port->port.line);
|
||||||
|
return pram;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = cpm_muram_alloc(64, 64);
|
||||||
|
out_be16(pram, offset);
|
||||||
|
iounmap(pram);
|
||||||
|
return cpm_muram_addr(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
|
||||||
|
{
|
||||||
|
if (!IS_ENABLED(CONFIG_CPM2) || !IS_SMC(port))
|
||||||
|
iounmap(pram);
|
||||||
|
}
|
||||||
|
|
||||||
static int cpm_uart_init_port(struct device_node *np,
|
static int cpm_uart_init_port(struct device_node *np,
|
||||||
struct uart_cpm_port *pinfo)
|
struct uart_cpm_port *pinfo)
|
||||||
@ -1255,19 +1380,14 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
|||||||
{
|
{
|
||||||
struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
|
struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int nolock = oops_in_progress;
|
|
||||||
|
|
||||||
if (unlikely(nolock)) {
|
if (unlikely(oops_in_progress)) {
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
} else {
|
cpm_uart_early_write(pinfo, s, count, true);
|
||||||
spin_lock_irqsave(&pinfo->port.lock, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
cpm_uart_early_write(pinfo, s, count, true);
|
|
||||||
|
|
||||||
if (unlikely(nolock)) {
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
} else {
|
} else {
|
||||||
|
spin_lock_irqsave(&pinfo->port.lock, flags);
|
||||||
|
cpm_uart_early_write(pinfo, s, count, true);
|
||||||
spin_unlock_irqrestore(&pinfo->port.lock, flags);
|
spin_unlock_irqrestore(&pinfo->port.lock, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1319,7 +1439,8 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
|
|||||||
if (options) {
|
if (options) {
|
||||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||||
} else {
|
} else {
|
||||||
if ((baud = uart_baudrate()) == -1)
|
baud = get_baudrate();
|
||||||
|
if (baud == -1)
|
||||||
baud = 9600;
|
baud = 9600;
|
||||||
}
|
}
|
||||||
|
|
@ -11,41 +11,31 @@
|
|||||||
#define CPM_UART_H
|
#define CPM_UART_H
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/fs_uart_pd.h>
|
|
||||||
|
|
||||||
struct gpio_desc;
|
struct gpio_desc;
|
||||||
|
|
||||||
#if defined(CONFIG_CPM2)
|
#if defined(CONFIG_CPM2)
|
||||||
#include "cpm_uart_cpm2.h"
|
#include "asm/cpm2.h"
|
||||||
#elif defined(CONFIG_CPM1)
|
#elif defined(CONFIG_CPM1)
|
||||||
#include "cpm_uart_cpm1.h"
|
#include "asm/cpm1.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DPRAM_BASE ((u8 __iomem *)cpm_muram_addr(0))
|
||||||
|
|
||||||
#define SERIAL_CPM_MAJOR 204
|
#define SERIAL_CPM_MAJOR 204
|
||||||
#define SERIAL_CPM_MINOR 46
|
#define SERIAL_CPM_MINOR 46
|
||||||
|
|
||||||
#define IS_SMC(pinfo) (pinfo->flags & FLAG_SMC)
|
#define IS_SMC(pinfo) (pinfo->flags & FLAG_SMC)
|
||||||
#define IS_DISCARDING(pinfo) (pinfo->flags & FLAG_DISCARDING)
|
|
||||||
#define FLAG_DISCARDING 0x00000004 /* when set, don't discard */
|
|
||||||
#define FLAG_SMC 0x00000002
|
#define FLAG_SMC 0x00000002
|
||||||
#define FLAG_CONSOLE 0x00000001
|
#define FLAG_CONSOLE 0x00000001
|
||||||
|
|
||||||
#define UART_SMC1 fsid_smc1_uart
|
#define UART_NR 6
|
||||||
#define UART_SMC2 fsid_smc2_uart
|
|
||||||
#define UART_SCC1 fsid_scc1_uart
|
|
||||||
#define UART_SCC2 fsid_scc2_uart
|
|
||||||
#define UART_SCC3 fsid_scc3_uart
|
|
||||||
#define UART_SCC4 fsid_scc4_uart
|
|
||||||
|
|
||||||
#define UART_NR fs_uart_nr
|
|
||||||
|
|
||||||
#define RX_NUM_FIFO 4
|
#define RX_NUM_FIFO 4
|
||||||
#define RX_BUF_SIZE 32
|
#define RX_BUF_SIZE 32
|
||||||
#define TX_NUM_FIFO 4
|
#define TX_NUM_FIFO 4
|
||||||
#define TX_BUF_SIZE 32
|
#define TX_BUF_SIZE 32
|
||||||
|
|
||||||
#define SCC_WAIT_CLOSING 100
|
|
||||||
|
|
||||||
#define GPIO_CTS 0
|
#define GPIO_CTS 0
|
||||||
#define GPIO_RTS 1
|
#define GPIO_RTS 1
|
||||||
#define GPIO_DCD 2
|
#define GPIO_DCD 2
|
||||||
@ -85,24 +75,6 @@ struct uart_cpm_port {
|
|||||||
struct gpio_desc *gpios[NUM_GPIOS];
|
struct gpio_desc *gpios[NUM_GPIOS];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct uart_cpm_port cpm_uart_ports[UART_NR];
|
|
||||||
|
|
||||||
/* these are located in their respective files */
|
|
||||||
void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd);
|
|
||||||
void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
|
|
||||||
struct device_node *np);
|
|
||||||
void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram);
|
|
||||||
int cpm_uart_init_portdesc(void);
|
|
||||||
int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con);
|
|
||||||
void cpm_uart_freebuf(struct uart_cpm_port *pinfo);
|
|
||||||
|
|
||||||
void smc1_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
void smc2_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
void scc1_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
void scc2_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
void scc3_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
void scc4_lineif(struct uart_cpm_port *pinfo);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
virtual to phys transtalion
|
virtual to phys transtalion
|
||||||
*/
|
*/
|
@ -1,12 +0,0 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
|
||||||
#
|
|
||||||
# Makefile for the Motorola 8xx FEC ethernet controller
|
|
||||||
#
|
|
||||||
|
|
||||||
obj-$(CONFIG_SERIAL_CPM) += cpm_uart.o
|
|
||||||
|
|
||||||
# Select the correct platform objects.
|
|
||||||
cpm_uart-objs-$(CONFIG_CPM2) += cpm_uart_cpm2.o
|
|
||||||
cpm_uart-objs-$(CONFIG_CPM1) += cpm_uart_cpm1.o
|
|
||||||
|
|
||||||
cpm_uart-objs := cpm_uart_core.o $(cpm_uart-objs-y)
|
|
@ -1,122 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0+
|
|
||||||
/*
|
|
||||||
* Driver for CPM (SCC/SMC) serial ports; CPM1 definitions
|
|
||||||
*
|
|
||||||
* Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
|
|
||||||
* Pantelis Antoniou (panto@intracom.gr) (CPM1)
|
|
||||||
*
|
|
||||||
* Copyright (C) 2004 Freescale Semiconductor, Inc.
|
|
||||||
* (C) 2004 Intracom, S.A.
|
|
||||||
* (C) 2006 MontaVista Software, Inc.
|
|
||||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/gfp.h>
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
#include <linux/serial.h>
|
|
||||||
#include <linux/console.h>
|
|
||||||
#include <linux/sysrq.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/memblock.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
#include <asm/fs_pd.h>
|
|
||||||
|
|
||||||
#include <linux/serial_core.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
|
|
||||||
#include <linux/of.h>
|
|
||||||
#include <linux/of_address.h>
|
|
||||||
|
|
||||||
#include "cpm_uart.h"
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
|
|
||||||
void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
|
|
||||||
{
|
|
||||||
cpm_command(port->command, cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
|
|
||||||
struct device_node *np)
|
|
||||||
{
|
|
||||||
return of_iomap(np, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
|
|
||||||
{
|
|
||||||
iounmap(pram);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate DP-Ram and memory buffers. We need to allocate a transmit and
|
|
||||||
* receive buffer descriptors from dual port ram, and a character
|
|
||||||
* buffer area from host mem. If we are allocating for the console we need
|
|
||||||
* to do it from bootmem
|
|
||||||
*/
|
|
||||||
int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
|
|
||||||
{
|
|
||||||
int dpmemsz, memsz;
|
|
||||||
u8 *dp_mem;
|
|
||||||
unsigned long dp_offset;
|
|
||||||
u8 *mem_addr;
|
|
||||||
dma_addr_t dma_addr = 0;
|
|
||||||
|
|
||||||
pr_debug("CPM uart[%d]:allocbuf\n", pinfo->port.line);
|
|
||||||
|
|
||||||
dpmemsz = sizeof(cbd_t) * (pinfo->rx_nrfifos + pinfo->tx_nrfifos);
|
|
||||||
dp_offset = cpm_dpalloc(dpmemsz, 8);
|
|
||||||
if (IS_ERR_VALUE(dp_offset)) {
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cpm_uart_cpm1.c: could not allocate buffer descriptors\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
dp_mem = cpm_dpram_addr(dp_offset);
|
|
||||||
|
|
||||||
memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) +
|
|
||||||
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
|
|
||||||
if (is_con) {
|
|
||||||
/* was hostalloc but changed cause it blows away the */
|
|
||||||
/* large tlb mapping when pinning the kernel area */
|
|
||||||
mem_addr = (u8 *) cpm_dpram_addr(cpm_dpalloc(memsz, 8));
|
|
||||||
dma_addr = (u32)cpm_dpram_phys(mem_addr);
|
|
||||||
} else
|
|
||||||
mem_addr = dma_alloc_coherent(pinfo->port.dev, memsz, &dma_addr,
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
if (mem_addr == NULL) {
|
|
||||||
cpm_dpfree(dp_offset);
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cpm_uart_cpm1.c: could not allocate coherent memory\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinfo->dp_addr = dp_offset;
|
|
||||||
pinfo->mem_addr = mem_addr; /* virtual address*/
|
|
||||||
pinfo->dma_addr = dma_addr; /* physical address*/
|
|
||||||
pinfo->mem_size = memsz;
|
|
||||||
|
|
||||||
pinfo->rx_buf = mem_addr;
|
|
||||||
pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
|
|
||||||
* pinfo->rx_fifosize);
|
|
||||||
|
|
||||||
pinfo->rx_bd_base = (cbd_t __iomem __force *)dp_mem;
|
|
||||||
pinfo->tx_bd_base = pinfo->rx_bd_base + pinfo->rx_nrfifos;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
|
|
||||||
{
|
|
||||||
dma_free_coherent(pinfo->port.dev, L1_CACHE_ALIGN(pinfo->rx_nrfifos *
|
|
||||||
pinfo->rx_fifosize) +
|
|
||||||
L1_CACHE_ALIGN(pinfo->tx_nrfifos *
|
|
||||||
pinfo->tx_fifosize), pinfo->mem_addr,
|
|
||||||
pinfo->dma_addr);
|
|
||||||
|
|
||||||
cpm_dpfree(pinfo->dp_addr);
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
/*
|
|
||||||
* Driver for CPM (SCC/SMC) serial ports
|
|
||||||
*
|
|
||||||
* definitions for cpm1
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CPM_UART_CPM1_H
|
|
||||||
#define CPM_UART_CPM1_H
|
|
||||||
|
|
||||||
#include <asm/cpm1.h>
|
|
||||||
|
|
||||||
static inline void cpm_set_brg(int brg, int baud)
|
|
||||||
{
|
|
||||||
cpm_setbrg(brg, baud);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpm_set_scc_fcr(scc_uart_t __iomem * sup)
|
|
||||||
{
|
|
||||||
out_8(&sup->scc_genscc.scc_rfcr, SMC_EB);
|
|
||||||
out_8(&sup->scc_genscc.scc_tfcr, SMC_EB);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpm_set_smc_fcr(smc_uart_t __iomem * up)
|
|
||||||
{
|
|
||||||
out_8(&up->smc_rfcr, SMC_EB);
|
|
||||||
out_8(&up->smc_tfcr, SMC_EB);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DPRAM_BASE ((u8 __iomem __force *)cpm_dpram_addr(0))
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,156 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0+
|
|
||||||
/*
|
|
||||||
* Driver for CPM (SCC/SMC) serial ports; CPM2 definitions
|
|
||||||
*
|
|
||||||
* Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
|
|
||||||
* Pantelis Antoniou (panto@intracom.gr) (CPM1)
|
|
||||||
*
|
|
||||||
* Copyright (C) 2004 Freescale Semiconductor, Inc.
|
|
||||||
* (C) 2004 Intracom, S.A.
|
|
||||||
* (C) 2006 MontaVista Software, Inc.
|
|
||||||
* Vitaly Bordug <vbordug@ru.mvista.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/serial.h>
|
|
||||||
#include <linux/console.h>
|
|
||||||
#include <linux/sysrq.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/memblock.h>
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
#include <asm/fs_pd.h>
|
|
||||||
|
|
||||||
#include <linux/serial_core.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
|
|
||||||
#include "cpm_uart.h"
|
|
||||||
|
|
||||||
/**************************************************************/
|
|
||||||
|
|
||||||
void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
|
|
||||||
{
|
|
||||||
cpm_command(port->command, cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __iomem *cpm_uart_map_pram(struct uart_cpm_port *port,
|
|
||||||
struct device_node *np)
|
|
||||||
{
|
|
||||||
void __iomem *pram;
|
|
||||||
unsigned long offset;
|
|
||||||
struct resource res;
|
|
||||||
resource_size_t len;
|
|
||||||
|
|
||||||
/* Don't remap parameter RAM if it has already been initialized
|
|
||||||
* during console setup.
|
|
||||||
*/
|
|
||||||
if (IS_SMC(port) && port->smcup)
|
|
||||||
return port->smcup;
|
|
||||||
else if (!IS_SMC(port) && port->sccup)
|
|
||||||
return port->sccup;
|
|
||||||
|
|
||||||
if (of_address_to_resource(np, 1, &res))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
len = resource_size(&res);
|
|
||||||
pram = ioremap(res.start, len);
|
|
||||||
if (!pram)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!IS_SMC(port))
|
|
||||||
return pram;
|
|
||||||
|
|
||||||
if (len != 2) {
|
|
||||||
printk(KERN_WARNING "cpm_uart[%d]: device tree references "
|
|
||||||
"SMC pram, using boot loader/wrapper pram mapping. "
|
|
||||||
"Please fix your device tree to reference the pram "
|
|
||||||
"base register instead.\n",
|
|
||||||
port->port.line);
|
|
||||||
return pram;
|
|
||||||
}
|
|
||||||
|
|
||||||
offset = cpm_dpalloc(PROFF_SMC_SIZE, 64);
|
|
||||||
out_be16(pram, offset);
|
|
||||||
iounmap(pram);
|
|
||||||
return cpm_muram_addr(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpm_uart_unmap_pram(struct uart_cpm_port *port, void __iomem *pram)
|
|
||||||
{
|
|
||||||
if (!IS_SMC(port))
|
|
||||||
iounmap(pram);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allocate DP-Ram and memory buffers. We need to allocate a transmit and
|
|
||||||
* receive buffer descriptors from dual port ram, and a character
|
|
||||||
* buffer area from host mem. If we are allocating for the console we need
|
|
||||||
* to do it from bootmem
|
|
||||||
*/
|
|
||||||
int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
|
|
||||||
{
|
|
||||||
int dpmemsz, memsz;
|
|
||||||
u8 __iomem *dp_mem;
|
|
||||||
unsigned long dp_offset;
|
|
||||||
u8 *mem_addr;
|
|
||||||
dma_addr_t dma_addr = 0;
|
|
||||||
|
|
||||||
pr_debug("CPM uart[%d]:allocbuf\n", pinfo->port.line);
|
|
||||||
|
|
||||||
dpmemsz = sizeof(cbd_t) * (pinfo->rx_nrfifos + pinfo->tx_nrfifos);
|
|
||||||
dp_offset = cpm_dpalloc(dpmemsz, 8);
|
|
||||||
if (IS_ERR_VALUE(dp_offset)) {
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cpm_uart_cpm.c: could not allocate buffer descriptors\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
dp_mem = cpm_dpram_addr(dp_offset);
|
|
||||||
|
|
||||||
memsz = L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize) +
|
|
||||||
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
|
|
||||||
if (is_con) {
|
|
||||||
mem_addr = kzalloc(memsz, GFP_NOWAIT);
|
|
||||||
dma_addr = virt_to_bus(mem_addr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
mem_addr = dma_alloc_coherent(pinfo->port.dev, memsz, &dma_addr,
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
if (mem_addr == NULL) {
|
|
||||||
cpm_dpfree(dp_offset);
|
|
||||||
printk(KERN_ERR
|
|
||||||
"cpm_uart_cpm.c: could not allocate coherent memory\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pinfo->dp_addr = dp_offset;
|
|
||||||
pinfo->mem_addr = mem_addr;
|
|
||||||
pinfo->dma_addr = dma_addr;
|
|
||||||
pinfo->mem_size = memsz;
|
|
||||||
|
|
||||||
pinfo->rx_buf = mem_addr;
|
|
||||||
pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
|
|
||||||
* pinfo->rx_fifosize);
|
|
||||||
|
|
||||||
pinfo->rx_bd_base = (cbd_t __iomem *)dp_mem;
|
|
||||||
pinfo->tx_bd_base = pinfo->rx_bd_base + pinfo->rx_nrfifos;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
|
|
||||||
{
|
|
||||||
dma_free_coherent(pinfo->port.dev, L1_CACHE_ALIGN(pinfo->rx_nrfifos *
|
|
||||||
pinfo->rx_fifosize) +
|
|
||||||
L1_CACHE_ALIGN(pinfo->tx_nrfifos *
|
|
||||||
pinfo->tx_fifosize), (void __force *)pinfo->mem_addr,
|
|
||||||
pinfo->dma_addr);
|
|
||||||
|
|
||||||
cpm_dpfree(pinfo->dp_addr);
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
/*
|
|
||||||
* Driver for CPM (SCC/SMC) serial ports
|
|
||||||
*
|
|
||||||
* definitions for cpm2
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CPM_UART_CPM2_H
|
|
||||||
#define CPM_UART_CPM2_H
|
|
||||||
|
|
||||||
#include <asm/cpm2.h>
|
|
||||||
|
|
||||||
static inline void cpm_set_brg(int brg, int baud)
|
|
||||||
{
|
|
||||||
cpm_setbrg(brg, baud);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpm_set_scc_fcr(scc_uart_t __iomem *sup)
|
|
||||||
{
|
|
||||||
out_8(&sup->scc_genscc.scc_rfcr, CPMFCR_GBL | CPMFCR_EB);
|
|
||||||
out_8(&sup->scc_genscc.scc_tfcr, CPMFCR_GBL | CPMFCR_EB);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void cpm_set_smc_fcr(smc_uart_t __iomem *up)
|
|
||||||
{
|
|
||||||
out_8(&up->smc_rfcr, CPMFCR_GBL | CPMFCR_EB);
|
|
||||||
out_8(&up->smc_tfcr, CPMFCR_GBL | CPMFCR_EB);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DPRAM_BASE ((u8 __iomem __force *)cpm_dpram_addr(0))
|
|
||||||
|
|
||||||
#endif
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user