* Did quatech changes make 3.8? (was: Re: Comments requested: driver for Quatech PCI serial cards)
From: Jonathan Woithe @ 2012-12-10 0:13 UTC (permalink / raw)
To: Greg KH; +Cc: Alan Cox, linux-serial, jwoithe
In-Reply-To: <20121128223300.GA24713@marvin.atrad.com.au>
On Thu, Nov 29, 2012 at 09:03:00AM +1030, Jonathan Woithe wrote:
> On Wed, Nov 28, 2012 at 09:30:10AM -0800, Greg KH wrote:
> > On Thu, Nov 29, 2012 at 12:11:40AM +1030, Jonathan Woithe wrote:
> > > On Wed, Nov 28, 2012 at 01:24:19PM +0000, Alan Cox wrote:
> > > > Can we get a Signed-off-by: for the first patch so we can try and get it
> > > > into 3.8 ?
> > >
> > > Sure. See below. The rest of the previous commit message was fine so I
> > > haven't replicated it here.
> >
> > Please do, otherwise I have to hand-edit the patch to add it back, and
> > odds are, I will get it wrong...
>
> No problem. See below. I took the opportunity to tweak the commit message
> a touch.
I am wondering (for documentation purposes) whether the quatech changes
below made 3.8 or whether they'll appear in 3.9. I don't see them in
linux-next or tty-next, but I'm still learning git and might have done
something wrong while searching.
jonathan
> From: Alan Cox <alan@linux.intel.com>
>
> quatech: add the other serial identifiers and preliminary control code
>
> Jonathan Woithe posted an out of tree enabler/control module for these
> cards. Lift the relevant identifiers and put them in the 8250_pci driver
> along with code used to control custom registers on these cards.
>
> Signed-off-by: Alan Cox <alan@linux.intel.com>
> Signed-off-by: Jonathan Woithe <jwoithe@just42.net>
>
> ---
> diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c
> index 17b7d26..43c6b4f 100644
> --- a/drivers/tty/serial/8250/8250_pci.c
> +++ b/drivers/tty/serial/8250/8250_pci.c
> @@ -1040,6 +1040,253 @@ static int pci_asix_setup(struct serial_private *priv,
> return pci_default_setup(priv, board, port, idx);
> }
>
> +/* Quatech devices have their own extra interface features */
> +
> +struct quatech_feature {
> + u16 devid;
> + bool amcc;
> +};
> +
> +#define QPCR_TEST_FOR1 0x3F
> +#define QPCR_TEST_GET1 0x00
> +#define QPCR_TEST_FOR2 0x40
> +#define QPCR_TEST_GET2 0x40
> +#define QPCR_TEST_FOR3 0x80
> +#define QPCR_TEST_GET3 0x40
> +#define QPCR_TEST_FOR4 0xC0
> +#define QPCR_TEST_GET4 0x80
> +
> +#define QOPR_CLOCK_X1 0x0000
> +#define QOPR_CLOCK_X2 0x0001
> +#define QOPR_CLOCK_X4 0x0002
> +#define QOPR_CLOCK_X8 0x0003
> +#define QOPR_CLOCK_RATE_MASK 0x0003
> +
> +
> +static struct quatech_feature quatech_cards[] = {
> + { PCI_DEVICE_ID_QUATECH_QSC100, 1 },
> + { PCI_DEVICE_ID_QUATECH_DSC100, 1 },
> + { PCI_DEVICE_ID_QUATECH_DSC100E, 0 },
> + { PCI_DEVICE_ID_QUATECH_DSC200, 1 },
> + { PCI_DEVICE_ID_QUATECH_DSC200E, 0 },
> + { PCI_DEVICE_ID_QUATECH_ESC100D, 1 },
> + { PCI_DEVICE_ID_QUATECH_ESC100M, 1 },
> + { PCI_DEVICE_ID_QUATECH_QSCP100, 1 },
> + { PCI_DEVICE_ID_QUATECH_DSCP100, 1 },
> + { PCI_DEVICE_ID_QUATECH_QSCP200, 1 },
> + { PCI_DEVICE_ID_QUATECH_DSCP200, 1 },
> + { PCI_DEVICE_ID_QUATECH_ESCLP100, 0 },
> + { PCI_DEVICE_ID_QUATECH_QSCLP100, 0 },
> + { PCI_DEVICE_ID_QUATECH_DSCLP100, 0 },
> + { PCI_DEVICE_ID_QUATECH_SSCLP100, 0 },
> + { PCI_DEVICE_ID_QUATECH_QSCLP200, 0 },
> + { PCI_DEVICE_ID_QUATECH_DSCLP200, 0 },
> + { PCI_DEVICE_ID_QUATECH_SSCLP200, 0 },
> + { PCI_DEVICE_ID_QUATECH_SPPXP_100, 0 },
> + { 0, }
> +};
> +
> +static int pci_quatech_amcc(u16 devid)
> +{
> + struct quatech_feature *qf = &quatech_cards[0];
> + while (qf->devid) {
> + if (qf->devid == devid)
> + return qf->amcc;
> + qf++;
> + }
> + pr_err("quatech: unknown port type '0x%04X'.\n", devid);
> + return 0;
> +};
> +
> +static int pci_quatech_rqopr(struct uart_8250_port *port)
> +{
> + unsigned long base = port->port.iobase;
> + u8 LCR, val;
> +
> + LCR = inb(base + UART_LCR);
> + outb(0xBF, base + UART_LCR);
> + val = inb(base + UART_SCR);
> + outb(LCR, base + UART_LCR);
> + return val;
> +}
> +
> +static void pci_quatech_wqopr(struct uart_8250_port *port, u8 qopr)
> +{
> + unsigned long base = port->port.iobase;
> + u8 LCR, val;
> +
> + LCR = inb(base + UART_LCR);
> + outb(0xBF, base + UART_LCR);
> + val = inb(base + UART_SCR);
> + outb(qopr, base + UART_SCR);
> + outb(LCR, base + UART_LCR);
> +}
> +
> +static int pci_quatech_rqmcr(struct uart_8250_port *port)
> +{
> + unsigned long base = port->port.iobase;
> + u8 LCR, val, qmcr;
> +
> + LCR = inb(base + UART_LCR);
> + outb(0xBF, base + UART_LCR);
> + val = inb(base + UART_SCR);
> + outb(val | 0x10, base + UART_SCR);
> + qmcr = inb(base + UART_MCR);
> + outb(val, base + UART_SCR);
> + outb(LCR, base + UART_LCR);
> +
> + return qmcr;
> +}
> +
> +static void pci_quatech_wqmcr(struct uart_8250_port *port, u8 qmcr)
> +{
> + unsigned long base = port->port.iobase;
> + u8 LCR, val;
> +
> + LCR = inb(base + UART_LCR);
> + outb(0xBF, base + UART_LCR);
> + val = inb(base + UART_SCR);
> + outb(val | 0x10, base + UART_SCR);
> + outb(qmcr, base + UART_MCR);
> + outb(val, base + UART_SCR);
> + outb(LCR, base + UART_LCR);
> +}
> +
> +static int pci_quatech_has_qmcr(struct uart_8250_port *port)
> +{
> + unsigned long base = port->port.iobase;
> + u8 LCR, val;
> +
> + LCR = inb(base + UART_LCR);
> + outb(0xBF, base + UART_LCR);
> + val = inb(base + UART_SCR);
> + if (val & 0x20) {
> + outb(0x80, UART_LCR);
> + if (!(inb(UART_SCR) & 0x20)) {
> + outb(LCR, base + UART_LCR);
> + return 1;
> + }
> + }
> + return 0;
> +}
> +
> +static int pci_quatech_test(struct uart_8250_port *port)
> +{
> + u8 reg;
> + u8 qopr = pci_quatech_rqopr(port);
> + pci_quatech_wqopr(port, qopr & QPCR_TEST_FOR1);
> + reg = pci_quatech_rqopr(port) & 0xC0;
> + if (reg != QPCR_TEST_GET1)
> + return -EINVAL;
> + pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR2);
> + reg = pci_quatech_rqopr(port) & 0xC0;
> + if (reg != QPCR_TEST_GET2)
> + return -EINVAL;
> + pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR3);
> + reg = pci_quatech_rqopr(port) & 0xC0;
> + if (reg != QPCR_TEST_GET3)
> + return -EINVAL;
> + pci_quatech_wqopr(port, (qopr & QPCR_TEST_FOR1)|QPCR_TEST_FOR4);
> + reg = pci_quatech_rqopr(port) & 0xC0;
> + if (reg != QPCR_TEST_GET4)
> + return -EINVAL;
> +
> + pci_quatech_wqopr(port, qopr);
> + return 0;
> +}
> +
> +static int pci_quatech_clock(struct uart_8250_port *port)
> +{
> + u8 qopr, reg, set;
> + unsigned long clock;
> +
> + if (pci_quatech_test(port) < 0)
> + return 1843200;
> +
> + qopr = pci_quatech_rqopr(port);
> +
> + pci_quatech_wqopr(port, qopr & ~QOPR_CLOCK_X8);
> + reg = pci_quatech_rqopr(port);
> + if (reg & QOPR_CLOCK_X8) {
> + clock = 1843200;
> + goto out;
> + }
> + pci_quatech_wqopr(port, qopr | QOPR_CLOCK_X8);
> + reg = pci_quatech_rqopr(port);
> + if (!(reg & QOPR_CLOCK_X8)) {
> + clock = 1843200;
> + goto out;
> + }
> + reg &= QOPR_CLOCK_X8;
> + if (reg == QOPR_CLOCK_X2) {
> + clock = 3685400;
> + set = QOPR_CLOCK_X2;
> + } else if (reg == QOPR_CLOCK_X4) {
> + clock = 7372800;
> + set = QOPR_CLOCK_X4;
> + } else if (reg == QOPR_CLOCK_X8) {
> + clock = 14745600;
> + set = QOPR_CLOCK_X8;
> + } else {
> + clock = 1843200;
> + set = QOPR_CLOCK_X1;
> + }
> + qopr &= ~QOPR_CLOCK_RATE_MASK;
> + qopr |= set;
> +
> +out:
> + pci_quatech_wqopr(port, qopr);
> + return clock;
> +}
> +
> +static int pci_quatech_rs422(struct uart_8250_port *port)
> +{
> + u8 qmcr;
> + int rs422 = 0;
> +
> + if (!pci_quatech_has_qmcr(port))
> + return 0;
> + qmcr = pci_quatech_rqmcr(port);
> + pci_quatech_wqmcr(port, 0xFF);
> + if (pci_quatech_rqmcr(port))
> + rs422 = 1;
> + pci_quatech_wqmcr(port, qmcr);
> + return rs422;
> +}
> +
> +static int pci_quatech_init(struct pci_dev *dev)
> +{
> + if (pci_quatech_amcc(dev->device)) {
> + unsigned long base = pci_resource_start(dev, 0);
> + if (base) {
> + u32 tmp;
> + outl(inl(base + 0x38), base + 0x38);
> + tmp = inl(base + 0x3c);
> + outl(tmp | 0x01000000, base + 0x3c);
> + outl(tmp, base + 0x3c);
> + }
> + }
> + return 0;
> +}
> +
> +static int pci_quatech_setup(struct serial_private *priv,
> + const struct pciserial_board *board,
> + struct uart_8250_port *port, int idx)
> +{
> + /* Needed by pci_quatech calls below */
> + port->port.iobase = pci_resource_start(priv->dev, FL_GET_BASE(board->flags));
> + /* Set up the clocking */
> + port->port.uartclk = pci_quatech_clock(port);
> + /* For now just warn about RS422 */
> + if (pci_quatech_rs422(port))
> + pr_warn( "quatech: software control of RS422 features not currently supported.\n");
> + return pci_default_setup(priv, board, port, idx);
> +}
> +
> +static void __devexit pci_quatech_exit(struct pci_dev *dev)
> +{
> +}
> +
> static int pci_default_setup(struct serial_private *priv,
> const struct pciserial_board *board,
> struct uart_8250_port *port, int idx)
> @@ -1503,6 +1750,16 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
> .setup = pci_default_setup,
> .exit = __devexit_p(pci_plx9050_exit),
> },
> + /* Quatech */
> + {
> + .vendor = PCI_VENDOR_ID_QUATECH,
> + .device = PCI_ANY_ID,
> + .subvendor = PCI_ANY_ID,
> + .subdevice = PCI_ANY_ID,
> + .init = pci_quatech_init,
> + .setup = pci_quatech_setup,
> + .exit = __devexit_p(pci_quatech_exit),
> + },
> /*
> * SBS Technologies, Inc., PMC-OCTALPRO 232
> */
> @@ -3257,18 +3514,70 @@ static struct pci_device_id serial_pci_tbl[] = {
> { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_ROMULUS,
> 0x10b5, 0x106a, 0, 0,
> pbn_plx_romulus },
> + /*
> + * Quatech cards. These actually have configurable clocks but for
> + * now we just use the default.
> + *
> + * 100 series are RS232, 200 series RS422,
> + */
> { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC100,
> PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> pbn_b1_4_115200 },
> { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100,
> PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> pbn_b1_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC100E,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSC200E,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSC200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_4_115200 },
> { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100D,
> PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> pbn_b1_8_115200 },
> { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESC100M,
> PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> pbn_b1_8_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_4_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCP200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_4_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCP200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b1_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_4_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_1_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_QSCLP200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_4_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_DSCLP200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_2_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SSCLP200,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b2_1_115200 },
> + { PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_ESCLP100,
> + PCI_ANY_ID, PCI_ANY_ID, 0, 0,
> + pbn_b0_8_115200 },
> +
> { PCI_VENDOR_ID_SPECIALIX, PCI_DEVICE_ID_OXSEMI_16PCI954,
> PCI_VENDOR_ID_SPECIALIX, PCI_SUBDEVICE_ID_SPECIALIX_SPEED4,
> 0, 0,
> diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
> index 9d36b82..ce45006 100644
> --- a/include/linux/pci_ids.h
> +++ b/include/linux/pci_ids.h
> @@ -1867,8 +1867,23 @@
> #define PCI_VENDOR_ID_QUATECH 0x135C
> #define PCI_DEVICE_ID_QUATECH_QSC100 0x0010
> #define PCI_DEVICE_ID_QUATECH_DSC100 0x0020
> +#define PCI_DEVICE_ID_QUATECH_DSC200 0x0030
> +#define PCI_DEVICE_ID_QUATECH_QSC200 0x0040
> #define PCI_DEVICE_ID_QUATECH_ESC100D 0x0050
> #define PCI_DEVICE_ID_QUATECH_ESC100M 0x0060
> +#define PCI_DEVICE_ID_QUATECH_QSCP100 0x0120
> +#define PCI_DEVICE_ID_QUATECH_DSCP100 0x0130
> +#define PCI_DEVICE_ID_QUATECH_QSCP200 0x0140
> +#define PCI_DEVICE_ID_QUATECH_DSCP200 0x0150
> +#define PCI_DEVICE_ID_QUATECH_QSCLP100 0x0170
> +#define PCI_DEVICE_ID_QUATECH_DSCLP100 0x0180
> +#define PCI_DEVICE_ID_QUATECH_DSC100E 0x0181
> +#define PCI_DEVICE_ID_QUATECH_SSCLP100 0x0190
> +#define PCI_DEVICE_ID_QUATECH_QSCLP200 0x01A0
> +#define PCI_DEVICE_ID_QUATECH_DSCLP200 0x01B0
> +#define PCI_DEVICE_ID_QUATECH_DSC200E 0x01B1
> +#define PCI_DEVICE_ID_QUATECH_SSCLP200 0x01C0
> +#define PCI_DEVICE_ID_QUATECH_ESCLP100 0x01E0
> #define PCI_DEVICE_ID_QUATECH_SPPXP_100 0x0278
>
> #define PCI_VENDOR_ID_SEALEVEL 0x135e
^ permalink raw reply
* [Consult]: Re: [PATCH] synclink fix ldisc buffer argument
From: Chen Gang @ 2012-12-10 1:32 UTC (permalink / raw)
To: Paul Fulghum; +Cc: Greg KH, Linux Kernel Mailing List, linux-serial, Alan Cox
In-Reply-To: <50C1513A.4010600@asianux.com>
Hello Paul Fulghum:
Firstly, sorry for my mistake:
I am a reporter (not reviewer), and not suitable to review maintainer's patch.
when you send relative patch, need not cc to me (I am not reviewer)
so:
could you send patch again (not need cc to me) ?
(and also it is better to mark me as Reported-by in your patch)
sorry for my mistake, again.
gchen.
于 2012年12月07日 10:15, Chen Gang 写道:
> Hello Greg Kroah-Hartman:
>
>
> 于 2012年12月04日 01:13, Paul Fulghum 写道:
>> Fix call to line discipline receive_buf by synclink drivers.
>> Dummy flag buffer argument is ignored by N_HDLC line discipline but might
>> be of insufficient size if accessed by a different line discipline
>> selected by mistake. flag buffer allocation now matches max size of data
>> buffer. Unused char_buf buffers are removed.
>>
>> Signed-off-by: Paul Fulghum <paulkf@microgate.com>
>
> if no additional questions:
> is it suitable to let this patch pass checking ?
> at least for me, it is surely solve an issue, and no negative effect.
>
> now, maybe Paul Fulghum is busy...
> the left questions what I have sent seems minor.
> so they can be delayed, until he has free time.
>
> when Paul Fulghum has free time.
> can still check what my left questions whether valid.
> if they are valid, can send additional patch for them.
>
>
> is it OK ?
>
> Regards
>
--
Chen Gang
Asianux Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: Did quatech changes make 3.8? (was: Re: Comments requested: driver for Quatech PCI serial cards)
From: Greg KH @ 2012-12-10 2:19 UTC (permalink / raw)
To: Jonathan Woithe; +Cc: Alan Cox, linux-serial
In-Reply-To: <20121210001347.GB22907@marvin.atrad.com.au>
On Mon, Dec 10, 2012 at 10:43:47AM +1030, Jonathan Woithe wrote:
> On Thu, Nov 29, 2012 at 09:03:00AM +1030, Jonathan Woithe wrote:
> > On Wed, Nov 28, 2012 at 09:30:10AM -0800, Greg KH wrote:
> > > On Thu, Nov 29, 2012 at 12:11:40AM +1030, Jonathan Woithe wrote:
> > > > On Wed, Nov 28, 2012 at 01:24:19PM +0000, Alan Cox wrote:
> > > > > Can we get a Signed-off-by: for the first patch so we can try and get it
> > > > > into 3.8 ?
> > > >
> > > > Sure. See below. The rest of the previous commit message was fine so I
> > > > haven't replicated it here.
> > >
> > > Please do, otherwise I have to hand-edit the patch to add it back, and
> > > odds are, I will get it wrong...
> >
> > No problem. See below. I took the opportunity to tweak the commit message
> > a touch.
>
> I am wondering (for documentation purposes) whether the quatech changes
> below made 3.8 or whether they'll appear in 3.9. I don't see them in
> linux-next or tty-next, but I'm still learning git and might have done
> something wrong while searching.
Odd, I somehow missed this, thinking Alan would resend it later, I'll
queue it up next week and it should make 3.8-final.
thanks,
greg k-h
^ permalink raw reply
* [PATCH 2/2] TTY: serial, add pm function
From: Rickard Andersson @ 2012-12-10 12:34 UTC (permalink / raw)
To: linux-serial, gregkh, linus.walleij
Cc: alan, daniel.lezcano, rickard.andersson
In-Reply-To: <1355142858-11046-1-git-send-email-rickard.andersson@stericsson.com>
Add power management function to tty driver interface
and add implementation for serial core.
Signed-off-by: Rickard Andersson <rickard.andersson@stericsson.com>
---
drivers/tty/serial/serial_core.c | 10 ++++++++++
include/linux/tty_driver.h | 8 ++++++++
2 files changed, 18 insertions(+)
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index b2fc8d7..3597dc8 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1114,6 +1114,15 @@ static int uart_get_icount(struct tty_struct *tty,
return 0;
}
+static int uart_pm(struct tty_struct *tty, enum tty_pm_state state)
+{
+ struct uart_state *ustate = tty->driver_data;
+
+ uart_change_pm(ustate, state);
+
+ return 0;
+}
+
/*
* Called via sys_ioctl. We can use spin_lock_irq() here.
*/
@@ -2217,6 +2226,7 @@ static const struct tty_operations uart_ops = {
.tiocmget = uart_tiocmget,
.tiocmset = uart_tiocmset,
.get_icount = uart_get_icount,
+ .pm = uart_pm,
#ifdef CONFIG_CONSOLE_POLL
.poll_init = uart_poll_init,
.poll_get_char = uart_poll_get_char,
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index d150a6f..ba34b7f 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -229,6 +229,12 @@
* Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
* structure to complete. This method is optional and will only be called
* if provided (otherwise EINVAL will be returned).
+ *
+ * int (*pm)(struct tty_struct * tty, enum tty_pm_state state);
+ *
+ * Perform any power management related activities on the specified
+ * tty. State indicates the new state.
+ *
*/
#include <linux/export.h>
@@ -249,6 +255,7 @@ struct serial_icounter_struct;
*/
enum tty_pm_state {
TTY_PM_STATE_ON = 0,
+ TTY_PM_STATE_SLEEP,
TTY_PM_STATE_OFF = 3, /* number taken from ACPI */
TTY_PM_STATE_UNDEFINED,
};
@@ -290,6 +297,7 @@ struct tty_operations {
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
int (*get_icount)(struct tty_struct *tty,
struct serial_icounter_struct *icount);
+ int (*pm)(struct tty_struct *tty, enum tty_pm_state state);
#ifdef CONFIG_CONSOLE_POLL
int (*poll_init)(struct tty_driver *driver, int line, char *options);
int (*poll_get_char)(struct tty_driver *driver, int line);
--
1.8.0
^ permalink raw reply related
* [PATCH 1/2] tty: move serial PM state to TTY driver interface
From: Rickard Andersson @ 2012-12-10 12:34 UTC (permalink / raw)
To: linux-serial, gregkh, linus.walleij
Cc: alan, daniel.lezcano, rickard.andersson
From: Linus Walleij <linus.walleij@linaro.org>
We want to make it possible for TTY drivers to control the
power state of the serial core, so as a first step make the
serial core power states generic and rename them TTY_*
so they can be used across all TTY drivers.
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
drivers/tty/serial/serial_core.c | 28 ++++++++++++++--------------
include/linux/serial_core.h | 14 +-------------
include/linux/tty_driver.h | 12 ++++++++++++
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 006c0ba..b2fc8d7 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -60,7 +60,7 @@ static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
struct ktermios *old_termios);
static void uart_wait_until_sent(struct tty_struct *tty, int timeout);
static void uart_change_pm(struct uart_state *state,
- enum uart_pm_state pm_state);
+ enum tty_pm_state pm_state);
static void uart_port_shutdown(struct tty_port *port);
@@ -1319,7 +1319,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
spin_lock_irqsave(&port->lock, flags);
} else if (!uart_console(uport)) {
spin_unlock_irqrestore(&port->lock, flags);
- uart_change_pm(state, UART_PM_STATE_OFF);
+ uart_change_pm(state, TTY_PM_STATE_OFF);
spin_lock_irqsave(&port->lock, flags);
}
@@ -1533,7 +1533,7 @@ static int uart_open(struct tty_struct *tty, struct file *filp)
* Make sure the device is in D0 state.
*/
if (port->count == 1)
- uart_change_pm(state, UART_PM_STATE_ON);
+ uart_change_pm(state, TTY_PM_STATE_ON);
/*
* Start up the serial port.
@@ -1574,7 +1574,7 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
{
struct uart_state *state = drv->state + i;
struct tty_port *port = &state->port;
- enum uart_pm_state pm_state;
+ enum tty_pm_state pm_state;
struct uart_port *uport = state->uart_port;
char stat_buf[32];
unsigned int status;
@@ -1599,12 +1599,12 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)
if (capable(CAP_SYS_ADMIN)) {
mutex_lock(&port->mutex);
pm_state = state->pm_state;
- if (pm_state != UART_PM_STATE_ON)
- uart_change_pm(state, UART_PM_STATE_ON);
+ if (pm_state != TTY_PM_STATE_ON)
+ uart_change_pm(state, TTY_PM_STATE_ON);
spin_lock_irq(&uport->lock);
status = uport->ops->get_mctrl(uport);
spin_unlock_irq(&uport->lock);
- if (pm_state != UART_PM_STATE_ON)
+ if (pm_state != TTY_PM_STATE_ON)
uart_change_pm(state, pm_state);
mutex_unlock(&port->mutex);
@@ -1852,7 +1852,7 @@ EXPORT_SYMBOL_GPL(uart_set_options);
* Locking: port->mutex has to be held
*/
static void uart_change_pm(struct uart_state *state,
- enum uart_pm_state pm_state)
+ enum tty_pm_state pm_state)
{
struct uart_port *port = state->uart_port;
@@ -1937,7 +1937,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
console_stop(uport->cons);
if (console_suspend_enabled || !uart_console(uport))
- uart_change_pm(state, UART_PM_STATE_OFF);
+ uart_change_pm(state, TTY_PM_STATE_OFF);
mutex_unlock(&port->mutex);
@@ -1982,7 +1982,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
termios = port->tty->termios;
if (console_suspend_enabled)
- uart_change_pm(state, UART_PM_STATE_ON);
+ uart_change_pm(state, TTY_PM_STATE_ON);
uport->ops->set_termios(uport, &termios, NULL);
if (console_suspend_enabled)
console_start(uport->cons);
@@ -1992,7 +1992,7 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
const struct uart_ops *ops = uport->ops;
int ret;
- uart_change_pm(state, UART_PM_STATE_ON);
+ uart_change_pm(state, TTY_PM_STATE_ON);
spin_lock_irq(&uport->lock);
ops->set_mctrl(uport, 0);
spin_unlock_irq(&uport->lock);
@@ -2092,7 +2092,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
uart_report_port(drv, port);
/* Power up port for set_mctrl() */
- uart_change_pm(state, UART_PM_STATE_ON);
+ uart_change_pm(state, TTY_PM_STATE_ON);
/*
* Ensure that the modem control lines are de-activated.
@@ -2116,7 +2116,7 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
* console if we have one.
*/
if (!uart_console(port))
- uart_change_pm(state, UART_PM_STATE_OFF);
+ uart_change_pm(state, TTY_PM_STATE_OFF);
}
}
@@ -2391,7 +2391,7 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
}
state->uart_port = uport;
- state->pm_state = UART_PM_STATE_UNDEFINED;
+ state->pm_state = TTY_PM_STATE_UNDEFINED;
uport->cons = drv->cons;
uport->state = state;
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index a83c5f6..75f89a7 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -202,25 +202,13 @@ static inline void serial_port_out(struct uart_port *up, int offset, int value)
up->serial_out(up, offset, value);
}
-/**
- * enum uart_pm_state - power states for UARTs
- * @UART_PM_STATE_ON: UART is powered, up and operational
- * @UART_PM_STATE_OFF: UART is powered off
- * @UART_PM_STATE_UNDEFINED: sentinel
- */
-enum uart_pm_state {
- UART_PM_STATE_ON = 0,
- UART_PM_STATE_OFF = 3, /* number taken from ACPI */
- UART_PM_STATE_UNDEFINED,
-};
-
/*
* This is the state information which is persistent across opens.
*/
struct uart_state {
struct tty_port port;
- enum uart_pm_state pm_state;
+ enum tty_pm_state pm_state;
struct circ_buf xmit;
struct uart_port *uart_port;
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index dd976cf..d150a6f 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -241,6 +241,18 @@ struct tty_struct;
struct tty_driver;
struct serial_icounter_struct;
+/**
+ * enum tty_pm_state - power states for TTYs
+ * @TTY_PM_STATE_ON: TTY is powered, up and operational
+ * @TTY_PM_STATE_OFF: TTY is powered off
+ * @TTY_PM_STATE_UNDEFINED: sentinel
+ */
+enum tty_pm_state {
+ TTY_PM_STATE_ON = 0,
+ TTY_PM_STATE_OFF = 3, /* number taken from ACPI */
+ TTY_PM_STATE_UNDEFINED,
+};
+
struct tty_operations {
struct tty_struct * (*lookup)(struct tty_driver *driver,
struct inode *inode, int idx);
--
1.8.0
^ permalink raw reply related
* Re: [PATCH -next 0/9] tty: Fix buffer work access-after-free
From: Ilya Zykov @ 2012-12-10 19:00 UTC (permalink / raw)
To: Peter Hurley
Cc: Alan Cox, Jiri Slaby, Greg Kroah-Hartman, linux-serial,
linux-kernel
In-Reply-To: <1354604865-10278-1-git-send-email-peter@hurleysoftware.com>
On 04.12.2012 11:07, Peter Hurley wrote:
>
> The most common cause stems from the n_tty_close() path spuriously
> scheduling buffer work, when the ldisc has already been halted.
> This is fixed in 'tty: Don't reschedule buffer work while closing'
Thank you,
very useful.
Fix this:
WARNING: at drivers/tty/tty_buffer.c:429 flush_to_ldisc+0x52/0x192()
Hardware name: P5K Premium
tty is NULL
...
Pid: 1394, comm: kworker/0:2 Tainted: P W O 3.7.0-rc8-next-20121210-debtty.1+ #4
Call Trace:
[<ffffffff8102d2f8>] warn_slowpath_common+0x80/0x98
[<ffffffff8102d3a4>] warn_slowpath_fmt+0x41/0x43
[<ffffffff8119c53a>] flush_to_ldisc+0x52/0x192
[<ffffffff812594bd>] ? __schedule+0x5dd/0x60c
[<ffffffff8103f146>] process_one_work+0x1c1/0x279
[<ffffffff8119c4e8>] ? tty_buffer_free_all+0x4d/0x4d
[<ffffffff8104104b>] worker_thread+0x154/0x24e
[<ffffffff81040ef7>] ? manage_workers+0x26c/0x26c
[<ffffffff810446ef>] kthread+0xb0/0xb8
[<ffffffff8104463f>] ? kthread_parkme+0x1f/0x1f
[<ffffffff8125f7ec>] ret_from_fork+0x7c/0xb0
[<ffffffff8104463f>] ? kthread_parkme+0x1f/0x1f
^ permalink raw reply
* [PATCH 5/6] tty: of_serial: Add pinctrl support
From: Maxime Ripard @ 2012-12-10 22:08 UTC (permalink / raw)
To: Arnd Bergmann, Olof Johansson
Cc: linux-arm-kernel, Stefan Roese, Alejandro Mery, Alan Cox,
Greg Kroah-Hartman, linux-serial
In-Reply-To: <1355177301-31928-1-git-send-email-maxime.ripard@free-electrons.com>
Use pinctrl to configure the SoCs pins directly from the driver.
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: Alan Cox <alan@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-serial@vger.kernel.org
---
drivers/tty/serial/of_serial.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
index df443b9..f66bdab 100644
--- a/drivers/tty/serial/of_serial.c
+++ b/drivers/tty/serial/of_serial.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/delay.h>
+#include <linux/pinctrl/consumer.h>
#include <linux/serial_core.h>
#include <linux/serial_8250.h>
#include <linux/serial_reg.h>
@@ -54,6 +55,7 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
int type, struct uart_port *port)
{
struct resource resource;
+ struct pinctrl *pinctrl;
struct device_node *np = ofdev->dev.of_node;
u32 clk, spd, prop;
int ret;
@@ -73,6 +75,11 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
return ret;
}
+ pinctrl = devm_pinctrl_get_select_default(&ofdev->dev);
+ if (IS_ERR(pinctrl))
+ dev_warn(&ofdev->dev,
+ "pins are not configured from the driver\n");
+
spin_lock_init(&port->lock);
port->mapbase = resource.start;
--
1.7.9.5
^ permalink raw reply related
* Re: Serial8250 doesn't populate in /proc/iomem?
From: Bjorn Helgaas @ 2012-12-11 2:54 UTC (permalink / raw)
To: Woody Wu; +Cc: linux-kernel, linux-arm, linux-samsung-soc, linux-serial
In-Reply-To: <slrnkcb00b.77o.narkewoody@zuhnb712.local.com>
[+cc linux-arm, linux-samsung-soc, linux-serial]
On Sun, Dec 9, 2012 at 11:25 PM, Woody Wu <narkewoody@gmail.com> wrote:
> Hi, list
>
> I found some io memory information is lost from /dev/iomem and want to
> find out why.
>
> I have a 2.6.16 kernel running on a ARM board (Samsung S3C2410). From
> the kernel log, I see 16 8250 serial ports were detected, and each of
> thoese ports has a memory address:
>
> Serial: 8250/16550 driver $Revision: 1.90 $ 16 ports, IRQ sharing enabled
> serial8250: tts0 at MMIO 0xe1400000 (irq = 16) is a 16550A
> serial8250: tts1 at MMIO 0xe1400008 (irq = 16) is a 16550A
> serial8250: tts2 at MMIO 0xe1400010 (irq = 17) is a 16550A
> serial8250: tts3 at MMIO 0xe1400018 (irq = 17) is a 16550A
> serial8250: tts4 at MMIO 0xe1400020 (irq = 18) is a 16550A
> serial8250: tts5 at MMIO 0xe1400028 (irq = 18) is a 16550A
> serial8250: tts6 at MMIO 0xe1400030 (irq = 19) is a 16550A
> serial8250: tts7 at MMIO 0xe1400038 (irq = 19) is a 16550A
> serial8250: tts8 at MMIO 0xe1400040 (irq = 48) is a 16550A
> serial8250: tts9 at MMIO 0xe1400048 (irq = 48) is a 16550A
> serial8250: tts10 at MMIO 0xe1400050 (irq = 49) is a 16550A
> serial8250: tts11 at MMIO 0xe1400058 (irq = 49) is a 16550A
> serial8250: tts12 at MMIO 0xe1400060 (irq = 60) is a 16550A
> serial8250: tts13 at MMIO 0xe1400068 (irq = 60) is a 16550A
> serial8250: tts14 at MMIO 0xe1400070 (irq = 61) is a 16550A
> serial8250: tts15 at MMIO 0xe1400078 (irq = 61) is a 16550A
>
> I can read/write these serial ports from /dev/ttys*, in other words,
> they do exist. I also can find the driver info from /proc/devices:
>
> Character devices:
>
> ...
> 4 /dev/vc/0
> 4 tty
> 4 tts
> 5 /dev/tty
> 5 /dev/console
> 5 /dev/ptmx
> 7 vcs
> ...
>
> The problem is, I don't understand why there is no information about
> these ports in /proc/iomem file. The 'iomem' file now contains:
>
> 11000000-11000ffe : AX88796B
> 19000000-19000ffe : AX88796B
> 30000000-33ffffff : System RAM
> 3001c000-301e826b : Kernel text
> 301ea000-302234a3 : Kernel data
> 49000000-490fffff : s3c2410-ohci
> 49000000-490fffff : ohci_hcd
> 4e000000-4e0fffff : s3c2410-nand
> 4e000000-4e0fffff : s3c2410-nand
> 50000000-50003fff : s3c2410-uart.0
> 50000000-500000ff : s3c2410-uart
> 50004000-50007fff : s3c2410-uart.1
> 50004000-500040ff : s3c2410-uart
> 50008000-5000bfff : s3c2410-uart.2
> 50008000-500080ff : s3c2410-uart
> 53000000-530fffff : s3c2410-wdt
> 54000000-540fffff : s3c2410-i2c
> 5a000000-5a0fffff : s3c2410-sdi
> 5a000000-5a0fffff : mmci-s3c2410
>
> You see, there is no serial8250 informations.
>
> Can anyone here please tell me how this can happen? Does it mean the
> serial8250 driver don't populate or register in the /proc/iomem?
That looks like a bug to me. There should be entries in /proc/iomem
for the hardware device (showing that something responds at that
address) and for the driver that claims the device.
I think the 8250 core does the reservation in
serial8250_request_std_resource(). You could try putting some printks
in that path to see whether it's exercised.
You're running a fairly old kernel, so it's possible the bug has
already been fixed.
Bjorn
^ permalink raw reply
* Re: [PATCH 2/2] TTY: serial, add pm function
From: Rickard Andersson @ 2012-12-11 17:06 UTC (permalink / raw)
To: Rickard ANDERSSON
Cc: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org,
Linus WALLEIJ, alan@linux.intel.com, daniel.lezcano@linaro.org
In-Reply-To: <1355142858-11046-2-git-send-email-rickard.andersson@stericsson.com>
On 12/10/2012 01:34 PM, Rickard ANDERSSON wrote:
> Add power management function to tty driver interface
> and add implementation for serial core.
>
> Signed-off-by: Rickard Andersson<rickard.andersson@stericsson.com>
> ---
> drivers/tty/serial/serial_core.c | 10 ++++++++++
> include/linux/tty_driver.h | 8 ++++++++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
> index b2fc8d7..3597dc8 100644
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -1114,6 +1114,15 @@ static int uart_get_icount(struct tty_struct *tty,
> return 0;
> }
>
> +static int uart_pm(struct tty_struct *tty, enum tty_pm_state state)
> +{
> + struct uart_state *ustate = tty->driver_data;
> +
> + uart_change_pm(ustate, state);
I just realized that I should hold "port->mutex" while calling
uart_change_pm(..).
I am waiting for further comments on the patch set.
BR
Rickard
^ permalink raw reply
* [GIT PATCH] TTY/Serial patches for 3.8-rc1
From: Greg KH @ 2012-12-11 20:11 UTC (permalink / raw)
To: Linus Torvalds, Alan Cox, Jiri Slaby
Cc: Andrew Morton, linux-kernel, linux-serial
The following changes since commit f4a75d2eb7b1e2206094b901be09adb31ba63681:
Linux 3.7-rc6 (2012-11-16 17:42:40 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git/ tags/tty-3.8-rc1
for you to fetch changes up to b0ab02361167faa82198b783a8d555eb6f58901c:
staging: sb105x: fix potential NULL pointer dereference in mp_chars_in_buffer() (2012-11-29 18:15:27 -0800)
----------------------------------------------------------------
TTY/Serial merge for 3.8-rc1
Here's the big tty/serial tree set of changes for 3.8-rc1.
Contained in here is a bunch more reworks of the tty port layer from Jiri and
bugfixes from Alan, along with a number of other tty and serial driver updates
by the various driver authors.
Also, Jiri has been coerced^Wconvinced to be the co-maintainer of the TTY
layer, which is much appreciated by me.
All of these have been in the linux-next tree for a while.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----------------------------------------------------------------
Alan Cox (7):
audit: remove bogus tty name check
uart: update the sysfs handler to use uart_get_info
uart: tidy the uart_get_info API
uart: add other serial core layer get attributes
moxa: dcd handling of CLOCAL is backwards
ipwireless: don't oops if we run out of space
serial: cast before shifting on port io
Alexander Shiyan (14):
serial: clps711x: Add platform_driver interface to clps711x driver
serial: clps711x: Convert all static variables to dynamic
serial: clps711x: Do not use "uart_port->unused" field
serial: clps711x: Using CPU clock subsystem for getting base UART speed
serial: clps711x: Improved TX FIFO handling
serial: clps711x: Return valid modem controls for port that not support it
serial: clps711x: Fix break control handling
serial: clps711x: Check for valid TTY in RX-interrupt
serial: clps711x: Using resource-managed functions
serial: clps711x: Disable "break"-state before port startup
serial: clps711x: Fix TERMIOS-flags handling
serial: clps711x: Cleanup driver
serial: Unneeded ARCH dependencies are removed
serial: max310x: Setup missing "can_sleep" field for GPIO
Alexey Brodkin (1):
serial/8250/8250_early: Prevent rounding error in uartclk
Andrew Morton (1):
drivers/tty/serial/serial_core.c: clean up HIGH_BITS_OFFSET usage
Bill Pemberton (9):
staging: dgrp: remove use of real_raw and read_cnt in dgrp_input
staging: dgrp: remove rawreadok module option
tty: remove use of __devexit_p
tty: serial: remove use of __devexit_p
tty: remove use of __devinit
tty: remove use of __devinitdata
tty: remove use of __devinitdata
tty: remove use of __devinitconst
tty: remove use of __devexit
Cyrill Gorcunov (3):
tty: pty - Move TIOCPKT handling into pty.c
tty, ioctls -- Add new ioctl definitions for tty flags fetching
tty: Add get- ioctls to fetch tty status v3
Daniel Vetter (2):
console: implement lockdep support for console_lock
console: use might_sleep in console_lock
David Rientjes (1):
mm, oom: ensure sysrq+f always passes valid zonelist
Denis V. Lunev (1):
tty: serial: KGDB support for PXA
Feng Tang (1):
serial: mfd: Add nmi_touch_watchdog() into the console write function
Gabor Juhos (1):
tty/serial/ar933x_uart: fix baud rate calculation
Greg Kroah-Hartman (3):
Merge 3.7-rc3 into tty-next
Merge v3.7-rc5 into tty-next
Merge 3.7-rc6 into tty-next
Heiko Stübner (1):
serial: samsung: add devicetree properties for non-Exynos SoCs
Huang Shijie (5):
serial: mxs-auart: distinguish the different SOCs
serial: mxs-auart: add the DMA support for mx28
ARM: dts: enable dma support for auart0 in mx28
serial: mxs-auart: disable the Receive Timeout Interrupt when DMA is enabled
serial: mxs-auart: unmap the scatter list before we copy the data
Ivo Sieben (3):
tty: prevent unnecessary work queue lock checking on flip buffer copy
TTY: Report warning when low_latency flag is wrongly used
tty: Use raw spin lock to protect TTY ldisc administration
James Hogan (1):
tty: serial: 8250_dw: Implement suspend/resume
Jiri Slaby (33):
TTY: devpts, don't care about TTY in devpts_get_tty
TTY: devpts, return created inode from devpts_pty_new
TTY: devpts, do not set driver_data
TTY: devpts, document devpts inode operations
TTY: move devpts kill to pty
TTY: vt, fix paste_selection ldisc handling
TTY: ldisc, wait for idle ldisc in release
TTY: hci_ldisc, remove invalid check in open
TTY: n_tty, simplify read_buf+echo_buf allocation
TTY: n_tty, remove bogus checks
TTY: audit, stop accessing tty->icount
TTY: n_tty, add ldisc data to n_tty
TTY: move ldisc data from tty_struct: simple members
TTY: move ldisc data from tty_struct: bitmaps
TTY: move ldisc data from tty_struct: read_* and echo_* and canon_* stuff
TTY: move ldisc data from tty_struct: locks
TTY: n_tty, propagate n_tty_data
TTY: move TTY_FLUSH* flags to tty_port
TTY: tty_buffer, cache pointer to tty->buf
TTY: add port -> tty link
TTY: move tty buffers to tty_port
UM: TTY: fix build errors now that tty->raw is gone
TTY: isicom, stop using port->tty
TTY: pty, fix tty buffers leak
ISDN: capi, use kref from tty_port
MMC: sdio_uart, remove unused member from sdio_uart_port
MMC: sdio, use kref from tty_port
TTY: n_gsm, use kref from tty_port
TTY: introduce tty_port_destroy
TTY: isicom, fix tty buffers memory leak
TTY: call tty_port_destroy in the rest of drivers
TTY: isdn/gigaset destroy tty_port properly
TTY: let me eat my own cooking
Joe Perches (1):
serial: jsm: Convert jsm_printk to jsm_dbg
Josh Cartwright (1):
serial: xilinx_uartps: kill CONFIG_OF conditional
Josh Triplett (3):
drivers/tty/vt/vt_ioctl.c: Include <linux/suspend.h> for pm_set_vt_switch
tty: Mark tty_del_file and __tty_hangup static
pty: Mark pty_resize static
Jun Chen (4):
serial: ifx6x60: add_timer is not safe in the mrdy_assert function
serial: ifx6x60: del_timer_sync must not be called in interrupt context.
serial: ifx6x60: ifx_spi_write don't need to do mrdy_assert when fifo is not empty
serial: ifx6x60: Add modem power off function in the platform reboot process
Kumar Amit Mehta (2):
staging: dgrp: dgrp_tty.c: Remove the TIOCSSOFTCAR ioctl handler from dgrp driver
staging: dgrp: dgrp_tty.c: Audit the return values of get/put_user()
Linus Walleij (1):
serial/amba-pl011: use devm_* managed resources
Masanari Iida (1):
staging: dgrp: Fix typo in dgrp driver
Matt Schulte (8):
Serial: Add support for new devices: Exar's XR17V35x family of multi-port PCIe UARTs
Add register definitions used in several Exar PCI/PCIe UARTs
serial: Optimization: check for presence of UPF_EXAR_EFR flag before serial_in
serial: Add initialization of sampling mode and tx/rx triggers to pci_xr17v35x_setup
tty/8250: Add sleep capability to XR17D15X ports
tty/8250 Add XR17D15x devices to the exar_handle_irq override
tty/8250 Add support for Commtech's Fastcom Async-335 and Fastcom Async-PCIe cards
tty/8250 Add check for pci_ioremap_bar failure
Maxime Bizon (1):
x86: ce4100: allow second UART usage
Murali Karicheri (2):
of serial port driver - add clk_get_rate() support
Documentation: of-serial.txt - update for clocks phandle for clk
Noam Camus (1):
tty/8250_early: Turn serial_in/serial_out into weak symbols.
Peter Hurley (5):
staging: fwserial: Add TTY-over-Firewire serial driver
staging/fwserial: Fix build breakage when !CONFIG_BUG
staging/fwserial: Destruct embedded tty_port on teardown
staging/fwserial: Use WARN_ONCE when port table is corrupted
staging/fwserial: Remove superfluous free
Randy Dunlap (1):
tty/serial: fix ifx6x60.c declaration warning
Sachin Kamat (1):
tty: vt: Remove redundant null check before kfree.
Sangho Yi (1):
tty: tty_mutex.c: Fixed coding style warning (using printk)
Sasha Levin (1):
tty: add missing newlines to WARN_RATELIMIT
Shinya Kuribayashi (5):
Revert "sh-sci / PM: Avoid deadlocking runtime PM"
Revert "sh-sci / PM: Use power.irq_safe"
Partially revert "serial: sh-sci: console Runtime PM support"
serial: sh-sci: add locking to console write function to avoid SMP lockup
serial: sh-sci: fix possible race cases on SCSCR register accesses
Shubhrajyoti D (3):
serial: omap: Make context_loss_cnt signed
serial: omap: Remove the default setting of special character
serial: omap: Remove the hardcode serial_omap_console_ports array.
Sonic Zhang (1):
serial: bfin_uart: Don't switch baud rate untill the transfer buffer is empty.
Steven Miao (1):
serial: bfin-uart: avoid dead lock in rx irq handler in smp kernel
Steven Rostedt (1):
staging: Add SystemBase Multi-2/PCI driver
Takashi YOSHII (4):
serial: sh-sci: fix condition test to set SCBRR
serial: sh-sci: support lower baud rate
serial: sh-sci: mask SCTFDR/RFDR according to fifosize
serial: sh-sci: fix common SCIFB regmap definition
Teppei Kamijou (1):
serial: sh-sci: console runtime PM support (revisit)
Thomas Abraham (2):
serial: samsung: use clk_prepare_enable and clk_disable_unprepare
serial: samsung: fix potential soft lockup during uart write
Tony Lindgren (1):
tty/serial/8250: Make omap hardware workarounds local to 8250.h
Vineet Gupta (1):
serial/arc-uart: Add new driver
Wei Yongjun (5):
serial: vt8500: fix possible memory leak in vt8500_serial_probe()
TTY: hvcs: fix missing unlock on error in hvcs_initialize()
serial: 8250_pci: use module_pci_driver to simplify the code
tty: of_serial: fix return value check in of_platform_serial_setup()
staging: sb105x: fix potential NULL pointer dereference in mp_chars_in_buffer()
chao bi (3):
serial: ifx6x60: different SPI word width configure requires different swap process
serial:ifx6x60:Prevent data transfer when IFX6x60 port is shutdown
serial:ifx6x60:SPI header is decoded incorrectly
Documentation/ABI/testing/sysfs-tty | 112 +++
Documentation/devicetree/bindings/tty/serial/fsl-mxs-auart.txt | 8 +
Documentation/devicetree/bindings/tty/serial/of-serial.txt | 5 +-
MAINTAINERS | 1 +
arch/alpha/include/asm/ioctls.h | 3 +
arch/alpha/kernel/srmcons.c | 5 +-
arch/arm/boot/dts/imx28.dtsi | 1 +
arch/arm/plat-omap/include/plat/serial.h | 9 -
arch/ia64/hp/sim/simserial.c | 1 +
arch/m68k/emu/nfcon.c | 6 +-
arch/mips/include/uapi/asm/ioctls.h | 3 +
arch/parisc/include/uapi/asm/ioctls.h | 3 +
arch/parisc/kernel/pdc_cons.c | 5 +-
arch/powerpc/include/uapi/asm/ioctls.h | 3 +
arch/sh/include/uapi/asm/ioctls.h | 3 +
arch/sparc/include/uapi/asm/ioctls.h | 3 +
arch/um/drivers/chan_kern.c | 17 +-
arch/um/drivers/line.c | 2 +
arch/x86/platform/ce4100/ce4100.c | 3 +
arch/xtensa/include/uapi/asm/ioctls.h | 3 +
arch/xtensa/platforms/iss/console.c | 1 +
drivers/bluetooth/hci_ldisc.c | 7 +-
drivers/char/pcmcia/synclink_cs.c | 5 +-
drivers/char/ttyprintk.c | 4 +-
drivers/isdn/capi/capi.c | 36 +-
drivers/isdn/gigaset/common.c | 1 +
drivers/isdn/i4l/isdn_tty.c | 4 +
drivers/misc/pti.c | 7 +-
drivers/mmc/card/sdio_uart.c | 24 +-
drivers/net/usb/hso.c | 5 +-
drivers/s390/char/con3215.c | 1 +
drivers/s390/char/sclp_tty.c | 4 +-
drivers/s390/char/sclp_vt220.c | 2 +
drivers/s390/char/tty3270.c | 2 +
drivers/staging/Kconfig | 4 +
drivers/staging/Makefile | 2 +
drivers/staging/ccg/u_serial.c | 5 +-
drivers/staging/dgrp/dgrp_common.h | 1 -
drivers/staging/dgrp/dgrp_driver.c | 4 -
drivers/staging/dgrp/dgrp_net_ops.c | 73 +-
drivers/staging/dgrp/dgrp_specproc.c | 4 +-
drivers/staging/dgrp/dgrp_sysfs.c | 18 -
drivers/staging/dgrp/dgrp_tty.c | 39 +-
drivers/staging/fwserial/Kconfig | 9 +
drivers/staging/fwserial/Makefile | 2 +
drivers/staging/fwserial/TODO | 37 +
drivers/staging/fwserial/dma_fifo.c | 307 ++++++++
drivers/staging/fwserial/dma_fifo.h | 130 ++++
drivers/staging/fwserial/fwserial.c | 2943 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/staging/fwserial/fwserial.h | 387 ++++++++++
drivers/staging/ipack/devices/ipoctal.c | 2 +
drivers/staging/sb105x/Kconfig | 9 +
drivers/staging/sb105x/Makefile | 3 +
drivers/staging/sb105x/sb_mp_register.h | 295 ++++++++
drivers/staging/sb105x/sb_pci_mp.c | 3196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/staging/sb105x/sb_pci_mp.h | 293 ++++++++
drivers/staging/sb105x/sb_ser_core.h | 368 +++++++++
drivers/tty/amiserial.c | 2 +
drivers/tty/bfin_jtag_comm.c | 6 +-
drivers/tty/cyclades.c | 28 +-
drivers/tty/ehv_bytechan.c | 4 +-
drivers/tty/hvc/hvc_opal.c | 8 +-
drivers/tty/hvc/hvc_vio.c | 6 +-
drivers/tty/hvc/hvc_xen.c | 2 +-
drivers/tty/hvc/hvcs.c | 20 +-
drivers/tty/hvc/hvsi.c | 1 +
drivers/tty/ipwireless/network.c | 5 +-
drivers/tty/ipwireless/tty.c | 1 +
drivers/tty/isicom.c | 35 +-
drivers/tty/moxa.c | 12 +-
drivers/tty/mxser.c | 35 +-
drivers/tty/n_gsm.c | 11 +-
drivers/tty/n_tty.c | 752 ++++++++++---------
drivers/tty/nozomi.c | 23 +-
drivers/tty/pty.c | 81 +-
drivers/tty/rocket.c | 4 +-
drivers/tty/serial/68328serial.c | 2 +
drivers/tty/serial/8250/8250.c | 98 ++-
drivers/tty/serial/8250/8250.h | 36 +
drivers/tty/serial/8250/8250_acorn.c | 6 +-
drivers/tty/serial/8250/8250_dw.c | 31 +-
drivers/tty/serial/8250/8250_early.c | 46 +-
drivers/tty/serial/8250/8250_em.c | 8 +-
drivers/tty/serial/8250/8250_hp300.c | 10 +-
drivers/tty/serial/8250/8250_pci.c | 352 +++++++--
drivers/tty/serial/8250/8250_pnp.c | 14 +-
drivers/tty/serial/Kconfig | 48 +-
drivers/tty/serial/Makefile | 1 +
drivers/tty/serial/altera_jtaguart.c | 6 +-
drivers/tty/serial/altera_uart.c | 6 +-
drivers/tty/serial/amba-pl011.c | 25 +-
drivers/tty/serial/apbuart.c | 2 +-
drivers/tty/serial/ar933x_uart.c | 96 ++-
drivers/tty/serial/arc_uart.c | 746 ++++++++++++++++++
drivers/tty/serial/atmel_serial.c | 10 +-
drivers/tty/serial/bcm63xx_uart.c | 6 +-
drivers/tty/serial/bfin_sport_uart.c | 6 +-
drivers/tty/serial/bfin_uart.c | 20 +-
drivers/tty/serial/clps711x.c | 595 +++++++--------
drivers/tty/serial/cpm_uart/cpm_uart_core.c | 4 +-
drivers/tty/serial/efm32-uart.c | 6 +-
drivers/tty/serial/icom.c | 14 +-
drivers/tty/serial/ifx6x60.c | 168 ++++-
drivers/tty/serial/ifx6x60.h | 2 +
drivers/tty/serial/ioc3_serial.c | 2 +-
drivers/tty/serial/jsm/jsm.h | 8 +-
drivers/tty/serial/jsm/jsm_driver.c | 9 +-
drivers/tty/serial/jsm/jsm_neo.c | 116 +--
drivers/tty/serial/jsm/jsm_tty.c | 104 +--
drivers/tty/serial/kgdb_nmi.c | 2 +
drivers/tty/serial/lpc32xx_hs.c | 6 +-
drivers/tty/serial/max3100.c | 6 +-
drivers/tty/serial/max310x.c | 11 +-
drivers/tty/serial/mcf.c | 6 +-
drivers/tty/serial/mfd.c | 7 +-
drivers/tty/serial/mpc52xx_uart.c | 2 +-
drivers/tty/serial/mrst_max3110.c | 6 +-
drivers/tty/serial/msm_serial.c | 2 +-
drivers/tty/serial/msm_serial_hs.c | 8 +-
drivers/tty/serial/mux.c | 6 +-
drivers/tty/serial/mxs-auart.c | 376 +++++++++-
drivers/tty/serial/of_serial.c | 38 +-
drivers/tty/serial/omap-serial.c | 30 +-
drivers/tty/serial/pch_uart.c | 4 +-
drivers/tty/serial/pxa.c | 55 ++
drivers/tty/serial/sa1100.c | 2 +-
drivers/tty/serial/samsung.c | 46 +-
drivers/tty/serial/sc26xx.c | 6 +-
drivers/tty/serial/sccnxp.c | 6 +-
drivers/tty/serial/serial_core.c | 186 ++++-
drivers/tty/serial/serial_txx9.c | 16 +-
drivers/tty/serial/sh-sci.c | 154 ++--
drivers/tty/serial/sirfsoc_uart.c | 4 +-
drivers/tty/serial/sunhv.c | 6 +-
drivers/tty/serial/sunsab.c | 8 +-
drivers/tty/serial/sunsu.c | 10 +-
drivers/tty/serial/sunzilog.c | 14 +-
drivers/tty/serial/timbuart.c | 6 +-
drivers/tty/serial/uartlite.c | 14 +-
drivers/tty/serial/vr41xx_siu.c | 8 +-
drivers/tty/serial/vt8500_serial.c | 14 +-
drivers/tty/serial/xilinx_uartps.c | 15 +-
drivers/tty/synclink.c | 7 +-
drivers/tty/synclink_gt.c | 11 +-
drivers/tty/synclinkmp.c | 11 +-
drivers/tty/sysrq.c | 3 +-
drivers/tty/tty_audit.c | 15 +-
drivers/tty/tty_buffer.c | 228 +++---
drivers/tty/tty_io.c | 24 +-
drivers/tty/tty_ioctl.c | 21 -
drivers/tty/tty_ldisc.c | 47 +-
drivers/tty/tty_mutex.c | 4 +-
drivers/tty/tty_port.c | 18 +-
drivers/tty/vt/consolemap.c | 6 +-
drivers/tty/vt/selection.c | 9 +-
drivers/tty/vt/vt.c | 5 +-
drivers/tty/vt/vt_ioctl.c | 1 +
drivers/usb/gadget/u_serial.c | 5 +-
drivers/usb/serial/usb-serial.c | 1 +
fs/compat_ioctl.c | 3 +
fs/devpts/inode.c | 61 +-
include/linux/devpts_fs.h | 20 +-
include/linux/pci_ids.h | 5 +
include/linux/serial_8250.h | 2 +
include/linux/tty.h | 45 +-
include/linux/tty_flip.h | 2 +-
include/uapi/asm-generic/ioctls.h | 3 +
include/uapi/linux/serial_core.h | 5 +-
include/uapi/linux/serial_reg.h | 18 +
kernel/auditsc.c | 2 +-
kernel/printk.c | 12 +-
net/irda/ircomm/ircomm_tty.c | 1 +
172 files changed, 11959 insertions(+), 1785 deletions(-)
create mode 100644 drivers/staging/fwserial/Kconfig
create mode 100644 drivers/staging/fwserial/Makefile
create mode 100644 drivers/staging/fwserial/TODO
create mode 100644 drivers/staging/fwserial/dma_fifo.c
create mode 100644 drivers/staging/fwserial/dma_fifo.h
create mode 100644 drivers/staging/fwserial/fwserial.c
create mode 100644 drivers/staging/fwserial/fwserial.h
create mode 100644 drivers/staging/sb105x/Kconfig
create mode 100644 drivers/staging/sb105x/Makefile
create mode 100644 drivers/staging/sb105x/sb_mp_register.h
create mode 100644 drivers/staging/sb105x/sb_pci_mp.c
create mode 100644 drivers/staging/sb105x/sb_pci_mp.h
create mode 100644 drivers/staging/sb105x/sb_ser_core.h
create mode 100644 drivers/tty/serial/arc_uart.c
^ permalink raw reply
* [PATCH] 8250/16?50: Add support for Broadcom TruManage redirected serial port
From: Stephen Hurd @ 2012-12-12 0:32 UTC (permalink / raw)
To: gregkh@linuxfoundation.org
Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 782 bytes --]
From: Stephen Hurd <shurd@broadcom.com>
Add support for the UART device present in Broadcom TruManage capable NetXtreme chips (ie: 5761m 5762, and 5725).
This implementation has a hidden transmit FIFO, so running in single-byte interrupt mode results in too many interrupts. The UART_CAP_HFIFO capability was added to track this. It continues to reload the THR as long as the THRE and TSRE bits are set in the LSR up to a specified limit (1024 is used here).
Signed-off-by: Stephen Hurd <shurd@broadcom.com>
---
Patch against linux-2.7 from ftp.kernel.org downloaded Dec-11-2012.
Sorry about the attachment, I'm required to use Outlook.
Stephen Hurd
Senior Staff Engineer - Software Development
Broadcom Corporation
949-926-8039
shurd@broadcom.com
[-- Attachment #2: brcm-trumanage-uart.patch --]
[-- Type: application/octet-stream, Size: 4143 bytes --]
diff -uprN -X linux-3.7/Documentation/dontdiff linux-3.7.orig/drivers/tty/serial/8250/8250.c linux-3.7/drivers/tty/serial/8250/8250.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.c 2012-12-11 15:56:40.686343959 -0800
@@ -290,6 +290,12 @@ static const struct serial8250_config ua
UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
.flags = UART_CAP_FIFO,
},
+ [PORT_BRCM_TRUMANAGE] = {
+ .name = "TruManage",
+ .fifo_size = 1,
+ .tx_loadsz = 1024,
+ .flags = UART_CAP_HFIFO,
+ },
[PORT_8250_CIR] = {
.name = "CIR port"
}
@@ -1441,6 +1447,11 @@ void serial8250_tx_chars(struct uart_825
port->icount.tx++;
if (uart_circ_empty(xmit))
break;
+ if (up->capabilities & UART_CAP_HFIFO) {
+ if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY)
+ != BOTH_EMPTY)
+ break;
+ }
} while (--count > 0);
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
diff -uprN -X linux-3.7/Documentation/dontdiff linux-3.7.orig/drivers/tty/serial/8250/8250.h linux-3.7/drivers/tty/serial/8250/8250.h
--- linux-3.7.orig/drivers/tty/serial/8250/8250.h 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.h 2012-12-11 14:57:48.641613676 -0800
@@ -40,6 +40,7 @@ struct serial8250_config {
#define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */
#define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */
#define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */
+#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
diff -uprN -X linux-3.7/Documentation/dontdiff linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c linux-3.7/drivers/tty/serial/8250/8250_pci.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250_pci.c 2012-12-11 15:58:10.958340077 -0800
@@ -1085,6 +1085,17 @@ pci_omegapci_setup(struct serial_private
return setup_port(priv, port, 2, idx * 8, 0);
}
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+ const struct pciserial_board *board,
+ struct uart_port *port, int idx)
+{
+ int ret = pci_default_setup(priv, board, port, idx);
+ port->type = PORT_BRCM_TRUMANAGE;
+ port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+ return ret;
+}
+
static int skip_tx_en_setup(struct serial_private *priv,
const struct pciserial_board *board,
struct uart_8250_port *port, int idx)
@@ -1213,6 +1224,7 @@ pci_wch_ch353_setup(struct serial_privat
#define PCI_VENDOR_ID_AGESTAR 0x5372
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
#define PCI_VENDOR_ID_ASIX 0x9710
+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -1788,6 +1800,17 @@ static struct pci_serial_quirk pci_seria
.setup = pci_asix_setup,
},
/*
+ * Broadcom TruManage (NetXtreme)
+ */
+ {
+ .vendor = PCI_VENDOR_ID_BROADCOM,
+ .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ .subvendor = PCI_ANY_ID,
+ .subdevice = PCI_ANY_ID,
+ .setup = pci_brcm_trumanage_setup,
+ },
+
+ /*
* Default "match everything" terminator entry
*/
{
@@ -1975,6 +1998,7 @@ enum pci_board_num_t {
pbn_ce4100_1_115200,
pbn_omegapci,
pbn_NETMOS9900_2s_115200,
+ pbn_brcm_trumanage,
};
/*
@@ -2674,6 +2698,12 @@ static struct pciserial_board pci_boards
.num_ports = 2,
.base_baud = 115200,
},
+ [pbn_brcm_trumanage] = {
+ .flags = FL_BASE0,
+ .num_ports = 1,
+ .reg_shift = 2,
+ .base_baud = 115200,
+ },
};
static const struct pci_device_id blacklist[] = {
@@ -4238,6 +4268,13 @@ static struct pci_device_id serial_pci_t
pbn_omegapci },
/*
+ * Broadcom TruManage
+ */
+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_brcm_trumanage },
+
+ /*
* AgeStar as-prs2-009
*/
{ PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
^ permalink raw reply
* RE: [PATCH] 8250/16?50: Add support for Broadcom TruManage redirected serial port
From: Stephen Hurd @ 2012-12-12 1:11 UTC (permalink / raw)
To: gregkh@linuxfoundation.org
Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 277 bytes --]
It appears that the modification to include/uapi/linux/serial_core.h is excluded by the dontdiff filters. I've attached an updated patch including it.
Stephen Hurd
Senior Staff Engineer - Software Development
Broadcom Corporation
949-926-8039
shurd@broadcom.com
[-- Attachment #2: brcm-trumanage-uart.patch --]
[-- Type: application/octet-stream, Size: 4703 bytes --]
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250.c linux-3.7/drivers/tty/serial/8250/8250.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.c 2012-12-11 15:56:40.686343959 -0800
@@ -290,6 +290,12 @@ static const struct serial8250_config ua
UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
.flags = UART_CAP_FIFO,
},
+ [PORT_BRCM_TRUMANAGE] = {
+ .name = "TruManage",
+ .fifo_size = 1,
+ .tx_loadsz = 1024,
+ .flags = UART_CAP_HFIFO,
+ },
[PORT_8250_CIR] = {
.name = "CIR port"
}
@@ -1441,6 +1447,11 @@ void serial8250_tx_chars(struct uart_825
port->icount.tx++;
if (uart_circ_empty(xmit))
break;
+ if (up->capabilities & UART_CAP_HFIFO) {
+ if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY)
+ != BOTH_EMPTY)
+ break;
+ }
} while (--count > 0);
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250.h linux-3.7/drivers/tty/serial/8250/8250.h
--- linux-3.7.orig/drivers/tty/serial/8250/8250.h 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.h 2012-12-11 14:57:48.641613676 -0800
@@ -40,6 +40,7 @@ struct serial8250_config {
#define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */
#define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */
#define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */
+#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c linux-3.7/drivers/tty/serial/8250/8250_pci.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250_pci.c 2012-12-11 15:58:10.958340077 -0800
@@ -1085,6 +1085,17 @@ pci_omegapci_setup(struct serial_private
return setup_port(priv, port, 2, idx * 8, 0);
}
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+ const struct pciserial_board *board,
+ struct uart_port *port, int idx)
+{
+ int ret = pci_default_setup(priv, board, port, idx);
+ port->type = PORT_BRCM_TRUMANAGE;
+ port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+ return ret;
+}
+
static int skip_tx_en_setup(struct serial_private *priv,
const struct pciserial_board *board,
struct uart_8250_port *port, int idx)
@@ -1213,6 +1224,7 @@ pci_wch_ch353_setup(struct serial_privat
#define PCI_VENDOR_ID_AGESTAR 0x5372
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
#define PCI_VENDOR_ID_ASIX 0x9710
+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -1788,6 +1800,17 @@ static struct pci_serial_quirk pci_seria
.setup = pci_asix_setup,
},
/*
+ * Broadcom TruManage (NetXtreme)
+ */
+ {
+ .vendor = PCI_VENDOR_ID_BROADCOM,
+ .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ .subvendor = PCI_ANY_ID,
+ .subdevice = PCI_ANY_ID,
+ .setup = pci_brcm_trumanage_setup,
+ },
+
+ /*
* Default "match everything" terminator entry
*/
{
@@ -1975,6 +1998,7 @@ enum pci_board_num_t {
pbn_ce4100_1_115200,
pbn_omegapci,
pbn_NETMOS9900_2s_115200,
+ pbn_brcm_trumanage,
};
/*
@@ -2674,6 +2698,12 @@ static struct pciserial_board pci_boards
.num_ports = 2,
.base_baud = 115200,
},
+ [pbn_brcm_trumanage] = {
+ .flags = FL_BASE0,
+ .num_ports = 1,
+ .reg_shift = 2,
+ .base_baud = 115200,
+ },
};
static const struct pci_device_id blacklist[] = {
@@ -4238,6 +4268,13 @@ static struct pci_device_id serial_pci_t
pbn_omegapci },
/*
+ * Broadcom TruManage
+ */
+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_brcm_trumanage },
+
+ /*
* AgeStar as-prs2-009
*/
{ PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
diff -uprN linux-3.7.orig/include/uapi/linux/serial_core.h linux-3.7/include/uapi/linux/serial_core.h
--- linux-3.7.orig/include/uapi/linux/serial_core.h 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/include/uapi/linux/serial_core.h 2012-12-11 15:00:07.005618440 -0800
@@ -49,7 +49,8 @@
#define PORT_XR17D15X 21 /* Exar XR17D15x UART */
#define PORT_LPC3220 22 /* NXP LPC32xx SoC "Standard" UART */
#define PORT_8250_CIR 23 /* CIR infrared port, has its own driver */
-#define PORT_MAX_8250 23 /* max port ID */
+#define PORT_BRCM_TRUMANAGE 24
+#define PORT_MAX_8250 24 /* max port ID */
/*
* ARM specific type numbers. These are not currently guaranteed
^ permalink raw reply
* [PATCH] serial:ifx6x60:Delete SPI timer when shut down port
From: chao bi @ 2012-12-12 3:40 UTC (permalink / raw)
To: Alan Cox; +Cc: richardx.r.gorby, jun.d.chen, linux-serial, linux-kernel
When shut down SPI port, it's possible that MRDY has been asserted and a SPI
timer was activated waiting for SRDY assert, in the case, it needs to delete
this timer.
Signed-off-by: Chen Jun <jun.d.chen@intel.com>
Signed-off-by: channing <chao.bi@intel.com>
---
drivers/tty/serial/ifx6x60.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/tty/serial/ifx6x60.c b/drivers/tty/serial/ifx6x60.c
index 675d94a..7eed323 100644
--- a/drivers/tty/serial/ifx6x60.c
+++ b/drivers/tty/serial/ifx6x60.c
@@ -637,6 +637,7 @@ static void ifx_port_shutdown(struct tty_port *port)
clear_bit(IFX_SPI_STATE_IO_AVAILABLE, &ifx_dev->flags);
mrdy_set_low(ifx_dev);
+ del_timer(&ifx_dev->spi_timer);
clear_bit(IFX_SPI_STATE_TIMER_PENDING, &ifx_dev->flags);
tasklet_kill(&ifx_dev->io_work_tasklet);
}
--
1.7.1
^ permalink raw reply related
* [PATCH] serial:ifx6x60:Keep word size accordance with SPI controller
From: chao bi @ 2012-12-12 5:07 UTC (permalink / raw)
To: Alan Cox; +Cc: richardx.r.gorby, jun.d.chen, linux-serial, linux-kernel
As protocol driver, IFX SPI driver initiate to setup SPI master with default
SPI word size as 16 bit/word, however, SPI master may not adopt this default
value due to SPI controller's capability, it might choose an available value by
itself and set it to spi_device.bits_per_word. In order to keep align with
Controller, IFX driver should make use of this value during SPI transfer,
but the default one.
Signed-off-by: Chen Jun <jun.d.chen@intel.com>
Signed-off-by: channing <chao.bi@intel.com>
---
drivers/tty/serial/ifx6x60.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/drivers/tty/serial/ifx6x60.c b/drivers/tty/serial/ifx6x60.c
index 675d94a..5919992 100644
--- a/drivers/tty/serial/ifx6x60.c
+++ b/drivers/tty/serial/ifx6x60.c
@@ -810,7 +810,8 @@ static void ifx_spi_io(unsigned long data)
ifx_dev->spi_xfer.cs_change = 0;
ifx_dev->spi_xfer.speed_hz = ifx_dev->spi_dev->max_speed_hz;
/* ifx_dev->spi_xfer.speed_hz = 390625; */
- ifx_dev->spi_xfer.bits_per_word = spi_bpw;
+ ifx_dev->spi_xfer.bits_per_word =
+ ifx_dev->spi_dev->bits_per_word;
ifx_dev->spi_xfer.tx_buf = ifx_dev->tx_buffer;
ifx_dev->spi_xfer.rx_buf = ifx_dev->rx_buffer;
--
1.7.1
^ permalink raw reply related
* RE: [PATCH] 8250/16?50: Add support for Broadcom TruManage redirected serial port
From: Stephen Hurd @ 2012-12-12 5:28 UTC (permalink / raw)
To: gregkh@linuxfoundation.org
Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <20121212044522.GA7224@kroah.com>
[-- Attachment #1: Type: text/plain, Size: 895 bytes --]
From: Stephen Hurd <shurd@broadcom.com>
Add support for the UART device present in Broadcom TruManage capable NetXtreme chips (ie: 5761m 5762, and 5725).
This implementation has a hidden transmit FIFO, so running in single-byte interrupt mode results in too many interrupts. The UART_CAP_HFIFO capability was added to track this. It continues to reload the THR as long as the THRE and TSRE bits are set in the LSR up to a specified limit (1024 is used here).
Signed-off-by: Stephen Hurd <shurd@broadcom.com>
---
Patch against linux-2.7 from ftp.kernel.org downloaded Dec-11-2012.
I don't know anybody here off hand who does Linux work nor am I in a position to configure the Exchange server. If this still isn't acceptable, I guess I could try emailing this patch around internally and hope it lands with someone has the appropriate magic available.
-- Stephen Hurd
[-- Attachment #2: brcm-trumanage-uart-patch.txt --]
[-- Type: text/plain, Size: 4703 bytes --]
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250.c linux-3.7/drivers/tty/serial/8250/8250.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.c 2012-12-11 15:56:40.686343959 -0800
@@ -290,6 +290,12 @@ static const struct serial8250_config ua
UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_00,
.flags = UART_CAP_FIFO,
},
+ [PORT_BRCM_TRUMANAGE] = {
+ .name = "TruManage",
+ .fifo_size = 1,
+ .tx_loadsz = 1024,
+ .flags = UART_CAP_HFIFO,
+ },
[PORT_8250_CIR] = {
.name = "CIR port"
}
@@ -1441,6 +1447,11 @@ void serial8250_tx_chars(struct uart_825
port->icount.tx++;
if (uart_circ_empty(xmit))
break;
+ if (up->capabilities & UART_CAP_HFIFO) {
+ if ((serial_port_in(port, UART_LSR) & BOTH_EMPTY)
+ != BOTH_EMPTY)
+ break;
+ }
} while (--count > 0);
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250.h linux-3.7/drivers/tty/serial/8250/8250.h
--- linux-3.7.orig/drivers/tty/serial/8250/8250.h 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250.h 2012-12-11 14:57:48.641613676 -0800
@@ -40,6 +40,7 @@ struct serial8250_config {
#define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */
#define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */
#define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */
+#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
diff -uprN linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c linux-3.7/drivers/tty/serial/8250/8250_pci.c
--- linux-3.7.orig/drivers/tty/serial/8250/8250_pci.c 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/drivers/tty/serial/8250/8250_pci.c 2012-12-11 15:58:10.958340077 -0800
@@ -1085,6 +1085,17 @@ pci_omegapci_setup(struct serial_private
return setup_port(priv, port, 2, idx * 8, 0);
}
+static int
+pci_brcm_trumanage_setup(struct serial_private *priv,
+ const struct pciserial_board *board,
+ struct uart_port *port, int idx)
+{
+ int ret = pci_default_setup(priv, board, port, idx);
+ port->type = PORT_BRCM_TRUMANAGE;
+ port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+ return ret;
+}
+
static int skip_tx_en_setup(struct serial_private *priv,
const struct pciserial_board *board,
struct uart_8250_port *port, int idx)
@@ -1213,6 +1224,7 @@ pci_wch_ch353_setup(struct serial_privat
#define PCI_VENDOR_ID_AGESTAR 0x5372
#define PCI_DEVICE_ID_AGESTAR_9375 0x6872
#define PCI_VENDOR_ID_ASIX 0x9710
+#define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a
/* Unknown vendors/cards - this should not be in linux/pci_ids.h */
#define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584
@@ -1788,6 +1800,17 @@ static struct pci_serial_quirk pci_seria
.setup = pci_asix_setup,
},
/*
+ * Broadcom TruManage (NetXtreme)
+ */
+ {
+ .vendor = PCI_VENDOR_ID_BROADCOM,
+ .device = PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ .subvendor = PCI_ANY_ID,
+ .subdevice = PCI_ANY_ID,
+ .setup = pci_brcm_trumanage_setup,
+ },
+
+ /*
* Default "match everything" terminator entry
*/
{
@@ -1975,6 +1998,7 @@ enum pci_board_num_t {
pbn_ce4100_1_115200,
pbn_omegapci,
pbn_NETMOS9900_2s_115200,
+ pbn_brcm_trumanage,
};
/*
@@ -2674,6 +2698,12 @@ static struct pciserial_board pci_boards
.num_ports = 2,
.base_baud = 115200,
},
+ [pbn_brcm_trumanage] = {
+ .flags = FL_BASE0,
+ .num_ports = 1,
+ .reg_shift = 2,
+ .base_baud = 115200,
+ },
};
static const struct pci_device_id blacklist[] = {
@@ -4238,6 +4268,13 @@ static struct pci_device_id serial_pci_t
pbn_omegapci },
/*
+ * Broadcom TruManage
+ */
+ { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BROADCOM_TRUMANAGE,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+ pbn_brcm_trumanage },
+
+ /*
* AgeStar as-prs2-009
*/
{ PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
diff -uprN linux-3.7.orig/include/uapi/linux/serial_core.h linux-3.7/include/uapi/linux/serial_core.h
--- linux-3.7.orig/include/uapi/linux/serial_core.h 2012-12-10 19:30:57.000000000 -0800
+++ linux-3.7/include/uapi/linux/serial_core.h 2012-12-11 15:00:07.005618440 -0800
@@ -49,7 +49,8 @@
#define PORT_XR17D15X 21 /* Exar XR17D15x UART */
#define PORT_LPC3220 22 /* NXP LPC32xx SoC "Standard" UART */
#define PORT_8250_CIR 23 /* CIR infrared port, has its own driver */
-#define PORT_MAX_8250 23 /* max port ID */
+#define PORT_BRCM_TRUMANAGE 24
+#define PORT_MAX_8250 24 /* max port ID */
/*
* ARM specific type numbers. These are not currently guaranteed
^ permalink raw reply
* Re: [PATCH] 8250/16?50: Add support for Broadcom TruManage redirected serial port
From: gregkh @ 2012-12-12 4:45 UTC (permalink / raw)
To: Stephen Hurd; +Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
In-Reply-To: <156984479488CD49A184F5CAB4AF934606FF55F8@IRVEXCHMB14.corp.ad.broadcom.com>
On Wed, Dec 12, 2012 at 01:11:47AM +0000, Stephen Hurd wrote:
> It appears that the modification to include/uapi/linux/serial_core.h is excluded by the dontdiff filters. I've attached an updated patch including it.
Care to resend the whole thing, I need it with the signed-off-by: line.
Also, base64 attachments really don't work well, if at all. You might
be forced to use Outlook, but Exchange can send patches if you configure
it properly. Please talk to your Broadcom coworkers for how to do this
properly, they know how to do it.
thanks,
greg k-h
^ permalink raw reply
* [PATCH v2] TTY: serial, add pm function
From: Rickard Andersson @ 2012-12-12 12:40 UTC (permalink / raw)
To: linux-serial, gregkh, linus.walleij
Cc: alan, daniel.lezcano, rickard.andersson
Add power management function to tty driver interface
and add implementation for serial core.
Signed-off-by: Rickard Andersson <rickard.andersson@stericsson.com>
---
ChangeLog v1->v2
- add mutex handling
---
drivers/tty/serial/serial_core.c | 13 +++++++++++++
include/linux/tty_driver.h | 8 ++++++++
2 files changed, 21 insertions(+)
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index b2fc8d7..ec501f5 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1114,6 +1114,18 @@ static int uart_get_icount(struct tty_struct *tty,
return 0;
}
+static int uart_pm(struct tty_struct *tty, enum tty_pm_state state)
+{
+ struct uart_state *ustate = tty->driver_data;
+ struct tty_port *port = &ustate->port;
+
+ mutex_lock(&port->mutex);
+ uart_change_pm(ustate, state);
+ mutex_unlock(&port->mutex);
+
+ return 0;
+}
+
/*
* Called via sys_ioctl. We can use spin_lock_irq() here.
*/
@@ -2217,6 +2229,7 @@ static const struct tty_operations uart_ops = {
.tiocmget = uart_tiocmget,
.tiocmset = uart_tiocmset,
.get_icount = uart_get_icount,
+ .pm = uart_pm,
#ifdef CONFIG_CONSOLE_POLL
.poll_init = uart_poll_init,
.poll_get_char = uart_poll_get_char,
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index d150a6f..ba34b7f 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -229,6 +229,12 @@
* Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
* structure to complete. This method is optional and will only be called
* if provided (otherwise EINVAL will be returned).
+ *
+ * int (*pm)(struct tty_struct * tty, enum tty_pm_state state);
+ *
+ * Perform any power management related activities on the specified
+ * tty. State indicates the new state.
+ *
*/
#include <linux/export.h>
@@ -249,6 +255,7 @@ struct serial_icounter_struct;
*/
enum tty_pm_state {
TTY_PM_STATE_ON = 0,
+ TTY_PM_STATE_SLEEP,
TTY_PM_STATE_OFF = 3, /* number taken from ACPI */
TTY_PM_STATE_UNDEFINED,
};
@@ -290,6 +297,7 @@ struct tty_operations {
int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
int (*get_icount)(struct tty_struct *tty,
struct serial_icounter_struct *icount);
+ int (*pm)(struct tty_struct *tty, enum tty_pm_state state);
#ifdef CONFIG_CONSOLE_POLL
int (*poll_init)(struct tty_driver *driver, int line, char *options);
int (*poll_get_char)(struct tty_driver *driver, int line);
--
1.8.0
^ permalink raw reply related
* [PATCH] mxs: uart: allow setting RTS from software
From: Steffen Trumtrar @ 2012-12-12 16:31 UTC (permalink / raw)
To: linux-serial
Cc: stable, linux-arm-kernel, Alan Cox, Huang Shijie,
Steffen Trumtrar
With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
mainline mxs-uart driver now sets RTSEN only when hardware flow control is
enabled via software. It is not possible any longer to set RTS manually via
software. However, the manual modification is a valid operation.
Regain the possibility to set RTS via software and only set RTSEN when hardware
flow control is explicitly enabled via settermios cflag CRTSCTS.
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
---
drivers/tty/serial/mxs-auart.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 6db23b0..9b62c4b 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
u32 ctrl = readl(u->membase + AUART_CTRL2);
- ctrl &= ~AUART_CTRL2_RTSEN;
+ ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
if (mctrl & TIOCM_RTS) {
if (tty_port_cts_enabled(&u->state->port))
ctrl |= AUART_CTRL2_RTSEN;
+ else
+ ctrl |= AUART_CTRL2_RTS;
}
s->ctrl = mctrl;
@@ -678,6 +680,10 @@ static void mxs_auart_settermios(struct uart_port *u,
}
ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
} else {
+ u->flags |= ASYNC_CTS_FLOW;
+ ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
+ } else {
+ u->flags &= ~ASYNC_CTS_FLOW;
ctrl2 &= ~(AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN);
}
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH] mxs: uart: allow setting RTS from software
From: Huang Shijie @ 2012-12-13 2:20 UTC (permalink / raw)
To: Steffen Trumtrar; +Cc: linux-serial, stable, linux-arm-kernel, Alan Cox
In-Reply-To: <1355329913-27666-1-git-send-email-s.trumtrar@pengutronix.de>
于 2012年12月13日 00:31, Steffen Trumtrar 写道:
> With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
> mainline mxs-uart driver now sets RTSEN only when hardware flow control is
> enabled via software. It is not possible any longer to set RTS manually via
> software. However, the manual modification is a valid operation.
> Regain the possibility to set RTS via software and only set RTSEN when hardware
Is there any user case to set the RTS via software?
I am confused at this.
> flow control is explicitly enabled via settermios cflag CRTSCTS.
>
> Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> ---
> drivers/tty/serial/mxs-auart.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> index 6db23b0..9b62c4b 100644
> --- a/drivers/tty/serial/mxs-auart.c
> +++ b/drivers/tty/serial/mxs-auart.c
> @@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
>
> u32 ctrl = readl(u->membase + AUART_CTRL2);
>
> - ctrl &= ~AUART_CTRL2_RTSEN;
> + ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
> if (mctrl & TIOCM_RTS) {
> if (tty_port_cts_enabled(&u->state->port))
> ctrl |= AUART_CTRL2_RTSEN;
> + else
> + ctrl |= AUART_CTRL2_RTS;
> }
>
> s->ctrl = mctrl;
> @@ -678,6 +680,10 @@ static void mxs_auart_settermios(struct uart_port *u,
> }
> ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> } else {
> + u->flags |= ASYNC_CTS_FLOW;
> + ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> + } else {
> + u->flags &= ~ASYNC_CTS_FLOW;
bug.
Your code adds TWO "else" here.
thanks
Huang Shijie
> ctrl2 &= ~(AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN);
> }
>
^ permalink raw reply
* Re: [PATCH] mxs: uart: allow setting RTS from software
From: Steffen Trumtrar @ 2012-12-13 8:40 UTC (permalink / raw)
To: Huang Shijie; +Cc: linux-serial, stable, linux-arm-kernel, Alan Cox
In-Reply-To: <50C93B6B.7090206@freescale.com>
Hi,
On Thu, Dec 13, 2012 at 10:20:27AM +0800, Huang Shijie wrote:
> 于 2012年12月13日 00:31, Steffen Trumtrar 写道:
> > With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
> > mainline mxs-uart driver now sets RTSEN only when hardware flow control is
> > enabled via software. It is not possible any longer to set RTS manually via
> > software. However, the manual modification is a valid operation.
> > Regain the possibility to set RTS via software and only set RTSEN when hardware
> Is there any user case to set the RTS via software?
> I am confused at this.
there are cases where the RTS is used in a non-standard way. And the always-on
hardware flowcontrol breaks these (e.g. Echelon FT5000).
And as stated in the commit message, it is a valid operation to use software
flow control.
> > flow control is explicitly enabled via settermios cflag CRTSCTS.
> >
> > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> > ---
> > drivers/tty/serial/mxs-auart.c | 8 +++++++-
> > 1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> > index 6db23b0..9b62c4b 100644
> > --- a/drivers/tty/serial/mxs-auart.c
> > +++ b/drivers/tty/serial/mxs-auart.c
> > @@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
> >
> > u32 ctrl = readl(u->membase + AUART_CTRL2);
> >
> > - ctrl &= ~AUART_CTRL2_RTSEN;
> > + ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
> > if (mctrl & TIOCM_RTS) {
> > if (tty_port_cts_enabled(&u->state->port))
> > ctrl |= AUART_CTRL2_RTSEN;
> > + else
> > + ctrl |= AUART_CTRL2_RTS;
> > }
> >
> > s->ctrl = mctrl;
> > @@ -678,6 +680,10 @@ static void mxs_auart_settermios(struct uart_port *u,
> > }
> > ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> > } else {
> > + u->flags |= ASYNC_CTS_FLOW;
> > + ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> > + } else {
> > + u->flags &= ~ASYNC_CTS_FLOW;
> bug.
>
> Your code adds TWO "else" here.
>
Oops, wrong merge resolution. Will fix that.
Regards,
Steffen
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH v2] mxs: uart: allow setting RTS from software
From: Steffen Trumtrar @ 2012-12-13 8:42 UTC (permalink / raw)
To: linux-serial
Cc: stable, linux-arm-kernel, Alan Cox, Huang Shijie,
Steffen Trumtrar
With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
mainline mxs-uart driver now sets RTSEN only when hardware flow control is
enabled via software. It is not possible any longer to set RTS manually via
software. However, the manual modification is a valid operation.
Regain the possibility to set RTS via software and only set RTSEN when hardware
flow control is explicitly enabled via settermios cflag CRTSCTS.
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
---
drivers/tty/serial/mxs-auart.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 6db23b0..21d9b12 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
u32 ctrl = readl(u->membase + AUART_CTRL2);
- ctrl &= ~AUART_CTRL2_RTSEN;
+ ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
if (mctrl & TIOCM_RTS) {
if (tty_port_cts_enabled(&u->state->port))
ctrl |= AUART_CTRL2_RTSEN;
+ else
+ ctrl |= AUART_CTRL2_RTS;
}
s->ctrl = mctrl;
@@ -676,8 +678,10 @@ static void mxs_auart_settermios(struct uart_port *u,
ctrl2 |= AUART_CTRL2_TXDMAE | AUART_CTRL2_RXDMAE
| AUART_CTRL2_DMAONERR;
}
+ u->flags |= ASYNC_CTS_FLOW;
ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
} else {
+ u->flags &= ~ASYNC_CTS_FLOW;
ctrl2 &= ~(AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN);
}
--
1.7.10.4
^ permalink raw reply related
* Re: [PATCH v2] mxs: uart: allow setting RTS from software
From: Huang Shijie @ 2012-12-13 10:19 UTC (permalink / raw)
To: Steffen Trumtrar; +Cc: linux-serial, stable, linux-arm-kernel, Alan Cox
In-Reply-To: <1355388135-3676-1-git-send-email-s.trumtrar@pengutronix.de>
于 2012年12月13日 16:42, Steffen Trumtrar 写道:
> With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
> mainline mxs-uart driver now sets RTSEN only when hardware flow control is
> enabled via software. It is not possible any longer to set RTS manually via
> software. However, the manual modification is a valid operation.
> Regain the possibility to set RTS via software and only set RTSEN when hardware
> flow control is explicitly enabled via settermios cflag CRTSCTS.
>
> Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> ---
> drivers/tty/serial/mxs-auart.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> index 6db23b0..21d9b12 100644
> --- a/drivers/tty/serial/mxs-auart.c
> +++ b/drivers/tty/serial/mxs-auart.c
> @@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
>
> u32 ctrl = readl(u->membase + AUART_CTRL2);
>
> - ctrl &= ~AUART_CTRL2_RTSEN;
> + ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
> if (mctrl & TIOCM_RTS) {
> if (tty_port_cts_enabled(&u->state->port))
> ctrl |= AUART_CTRL2_RTSEN;
> + else
> + ctrl |= AUART_CTRL2_RTS;
> }
>
> s->ctrl = mctrl;
> @@ -676,8 +678,10 @@ static void mxs_auart_settermios(struct uart_port *u,
> ctrl2 |= AUART_CTRL2_TXDMAE | AUART_CTRL2_RXDMAE
> | AUART_CTRL2_DMAONERR;
> }
> + u->flags |= ASYNC_CTS_FLOW;
> ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> } else {
> + u->flags &= ~ASYNC_CTS_FLOW;
I think these two lines is not needed.
uart_change_speed() has set/unset ASYNC_CTS_FLOW for us.
thanks
Huang Shijie
> ctrl2 &= ~(AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN);
> }
>
^ permalink raw reply
* Re: [PATCH v2] mxs: uart: allow setting RTS from software
From: Steffen Trumtrar @ 2012-12-13 13:19 UTC (permalink / raw)
To: Huang Shijie; +Cc: linux-serial, stable, linux-arm-kernel, Alan Cox
In-Reply-To: <50C9ABB4.8010900@freescale.com>
On Thu, Dec 13, 2012 at 06:19:32PM +0800, Huang Shijie wrote:
> 于 2012年12月13日 16:42, Steffen Trumtrar 写道:
> > With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
> > mainline mxs-uart driver now sets RTSEN only when hardware flow control is
> > enabled via software. It is not possible any longer to set RTS manually via
> > software. However, the manual modification is a valid operation.
> > Regain the possibility to set RTS via software and only set RTSEN when hardware
> > flow control is explicitly enabled via settermios cflag CRTSCTS.
> >
> > Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> > ---
> > drivers/tty/serial/mxs-auart.c | 6 +++++-
> > 1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> > index 6db23b0..21d9b12 100644
> > --- a/drivers/tty/serial/mxs-auart.c
> > +++ b/drivers/tty/serial/mxs-auart.c
> > @@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
> >
> > u32 ctrl = readl(u->membase + AUART_CTRL2);
> >
> > - ctrl &= ~AUART_CTRL2_RTSEN;
> > + ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
> > if (mctrl & TIOCM_RTS) {
> > if (tty_port_cts_enabled(&u->state->port))
> > ctrl |= AUART_CTRL2_RTSEN;
> > + else
> > + ctrl |= AUART_CTRL2_RTS;
> > }
> >
> > s->ctrl = mctrl;
> > @@ -676,8 +678,10 @@ static void mxs_auart_settermios(struct uart_port *u,
> > ctrl2 |= AUART_CTRL2_TXDMAE | AUART_CTRL2_RXDMAE
> > | AUART_CTRL2_DMAONERR;
> > }
> > + u->flags |= ASYNC_CTS_FLOW;
> > ctrl2 |= AUART_CTRL2_CTSEN | AUART_CTRL2_RTSEN;
> > } else {
> > + u->flags &= ~ASYNC_CTS_FLOW;
> I think these two lines is not needed.
> uart_change_speed() has set/unset ASYNC_CTS_FLOW for us.
I don't know that much of the inner workings of the serial framework, but it
seems like it is guaranteed, that uart_change_speed is called before the
mxs_auart_settermios. And therefore you are right and the two lines can be
dropped.
Regards,
Steffen
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH v3] mxs: uart: allow setting RTS from software
From: Steffen Trumtrar @ 2012-12-13 13:27 UTC (permalink / raw)
To: linux-serial
Cc: stable, linux-arm-kernel, Alan Cox, Huang Shijie,
Steffen Trumtrar
With the patch "serial: mxs-auart: fix the wrong RTS hardware flow control" the
mainline mxs-uart driver now sets RTSEN only when hardware flow control is
enabled via software. It is not possible any longer to set RTS manually via
software. However, the manual modification is a valid operation.
Regain the possibility to set RTS via software and only set RTSEN when hardware
flow control is explicitly enabled via settermios cflag CRTSCTS.
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
---
drivers/tty/serial/mxs-auart.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 6db23b0..9f63f88 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -412,10 +412,12 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
u32 ctrl = readl(u->membase + AUART_CTRL2);
- ctrl &= ~AUART_CTRL2_RTSEN;
+ ctrl &= ~(AUART_CTRL2_RTSEN | AUART_CTRL2_RTS);
if (mctrl & TIOCM_RTS) {
if (tty_port_cts_enabled(&u->state->port))
ctrl |= AUART_CTRL2_RTSEN;
+ else
+ ctrl |= AUART_CTRL2_RTS;
}
s->ctrl = mctrl;
--
1.7.10.4
^ permalink raw reply related
* Edgeport/416 io_edgeport problem.
From: David Robillard @ 2012-12-13 20:03 UTC (permalink / raw)
To: linux-serial
Hello everyone,
I'm having a problem with a Digi Inside Out Networks Edgeport/416
device. According to the kernel.org file (see exerpt below) this
particular model is not listed in the supported products.
The device is connected to a 32 bit CentOS 6.3 machine running with
kernel 2.6.32-279.14.1.el6.i686. When I connect the Edgeport/416, the
messages which show up in /var/log/messages don't show any errors (see
below). The 16 /dev/ttyUSB character devices are created in /dev. I
can see the Edgeport/416 in /proc/bus/devices and in
/sys/bus/usb/drivers/io_edgeport.
But when I try to access any one of the 16 ports, I always get a
timeout followed by a no such device error. If I do this...
sudo strace cat /dev/ttyUSB14
...it always fail with this line :
open("/dev/ttyUSB14", O_RDONLY|O_LARGEFILE) = -1 ENODEV (No such device)
I tried to contact Digi, but their answer is a bit dull :
this driver is supported by the Linux community, we recommend
contacting the Linux-USB group to see if they might be familiar with
this behavior and a possible patch. Otherwise, a bug report should be
filed with them.
I'm not quite sure where to go from there? Any help would be very appreciated.
Many thanks,
David
P.S. Below is the output when I connect the unit to the CentOS machine
and the contents of the
http://www.kernel.org/doc/Documentation/usb/usb-serial.txt file.
Dec 12 14:42:40 solo kernel: usb 1-2: new full speed USB device number
2 using ohci_hcd
Dec 12 14:42:40 solo kernel: usb 1-2: New USB device found,
idVendor=0451, idProduct=2077
Dec 12 14:42:40 solo kernel: usb 1-2: New USB device strings: Mfr=0,
Product=1, SerialNumber=0
Dec 12 14:42:40 solo kernel: usb 1-2: Product: General Purpose USB Hub
Dec 12 14:42:40 solo kernel: usb 1-2: configuration #1 chosen from 1 choice
Dec 12 14:42:40 solo kernel: hub 1-2:1.0: USB hub found
Dec 12 14:42:40 solo kernel: hub 1-2:1.0: 7 ports detected
Dec 12 14:42:40 solo kernel: usb 1-2.5: new full speed USB device
number 3 using ohci_hcd
Dec 12 14:42:40 solo kernel: usb 1-2.5: New USB device found,
idVendor=1608, idProduct=0012
Dec 12 14:42:40 solo kernel: usb 1-2.5: New USB device strings: Mfr=1,
Product=2, SerialNumber=5
Dec 12 14:42:40 solo kernel: usb 1-2.5: Product: Edgeport/416
Dec 12 14:42:40 solo kernel: usb 1-2.5: Manufacturer: Inside Out Networks
Dec 12 14:42:40 solo kernel: usb 1-2.5: SerialNumber: V70430350-0
Dec 12 14:42:40 solo kernel: usb 1-2.5: configuration #1 chosen from 1 choice
Dec 12 14:42:40 solo kernel: usbcore: registered new interface driver usbserial
Dec 12 14:42:40 solo kernel: USB Serial support registered for generic
Dec 12 14:42:40 solo kernel: usb 1-2.6: new full speed USB device
number 4 using ohci_hcd
Dec 12 14:42:41 solo kernel: usb 1-2.6: New USB device found,
idVendor=1608, idProduct=0012
Dec 12 14:42:41 solo kernel: usb 1-2.6: New USB device strings: Mfr=1,
Product=2, SerialNumber=5
Dec 12 14:42:41 solo kernel: usb 1-2.6: Product: Edgeport/416
Dec 12 14:42:41 solo kernel: usb 1-2.6: Manufacturer: Inside Out Networks
Dec 12 14:42:41 solo kernel: usb 1-2.6: SerialNumber: V70430350-1
Dec 12 14:42:41 solo kernel: usb 1-2.6: configuration #1 chosen from 1 choice
Dec 12 14:42:41 solo kernel: usbcore: registered new interface driver
usbserial_generic
Dec 12 14:42:41 solo kernel: usbserial: USB Serial Driver core
Dec 12 14:42:41 solo kernel: USB Serial support registered for
Edgeport 2 port adapter
Dec 12 14:42:41 solo kernel: USB Serial support registered for
Edgeport 4 port adapter
Dec 12 14:42:41 solo kernel: USB Serial support registered for
Edgeport 8 port adapter
Dec 12 14:42:41 solo kernel: USB Serial support registered for EPiC device
Dec 12 14:42:41 solo kernel: io_edgeport 1-2.5:1.0: Edgeport 8 port
adapter converter detected
Dec 12 14:42:41 solo kernel: usb 1-2.5: Inside Out Networks
Edgeport/416 detected
Dec 12 14:42:41 solo kernel: usb 1-2.5: firmware: requesting edgeport/down.fw
Dec 12 14:42:42 solo kernel: usb 1-2.5: firmware: requesting edgeport/boot.fw
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB0
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB1
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB2
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB3
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB4
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB5
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB6
Dec 12 14:42:42 solo kernel: usb 1-2.5: Edgeport 8 port adapter
converter now attached to ttyUSB7
Dec 12 14:42:42 solo kernel: io_edgeport 1-2.6:1.0: Edgeport 8 port
adapter converter detected
Dec 12 14:42:42 solo kernel: usb 1-2.6: Inside Out Networks
Edgeport/416 detected
Dec 12 14:42:42 solo kernel: usb 1-2.6: firmware: requesting edgeport/down.fw
Dec 12 14:42:43 solo kernel: usb 1-2.6: firmware: requesting edgeport/boot.fw
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB8
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB9
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB10
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB11
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB12
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB13
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB14
Dec 12 14:42:43 solo kernel: usb 1-2.6: Edgeport 8 port adapter
converter now attached to ttyUSB15
Dec 12 14:42:43 solo kernel: usbcore: registered new interface driver
io_edgeport
Dec 12 14:42:43 solo kernel: io_edgeport: v2.7:Edgeport USB Serial Driver
Inside Out Networks Edgeport Driver
This driver supports all devices made by Inside Out Networks, specifically
the following models:
Edgeport/4
Rapidport/4
Edgeport/4t
Edgeport/2
Edgeport/4i
Edgeport/2i
Edgeport/421
Edgeport/21
Edgeport/8
Edgeport/8 Dual
Edgeport/2D8
Edgeport/4D8
Edgeport/8i
Edgeport/2 DIN
Edgeport/4 DIN
Edgeport/16 Dual
For any questions or problems with this driver, please contact Greg
Kroah-Hartman at greg@kroah.com
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox