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:
Linus Torvalds 2023-09-01 09:38:00 -07:00
commit 8e1e49550d
185 changed files with 2104 additions and 2173 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 */
};

View File

@ -117,7 +117,6 @@ properties:
required: required:
- compatible - compatible
- reg - reg
- interrupts
unevaluatedProperties: false unevaluatedProperties: false

View File

@ -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

View File

@ -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();
} }

View File

@ -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;

View File

@ -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>;

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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)

View File

@ -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();

View File

@ -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 {

View File

@ -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();
} }

View File

@ -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;

View File

@ -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);

View File

@ -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,
}; };

View File

@ -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]);

View File

@ -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,
}; };

View File

@ -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;

View File

@ -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);
} }

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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);

View File

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

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 */

View File

@ -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 },

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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);
} }

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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>

View File

@ -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.

View File

@ -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;
} }

View File

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

View File

@ -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;

View File

@ -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) */

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

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

View File

@ -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");

View File

@ -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;

View File

@ -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>

View File

@ -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>

View File

@ -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,

View File

@ -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>

View File

@ -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,

View File

@ -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);

View File

@ -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");

View File

@ -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

View File

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

View File

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

View File

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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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;
} }

View File

@ -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
*/ */

View File

@ -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)

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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