]> err.no Git - linux-2.6/commitdiff
[POWERPC] Make the hvc_console output buffer size settable
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 13 Jul 2006 08:53:32 +0000 (18:53 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 13 Jul 2006 08:53:32 +0000 (18:53 +1000)
So the iSeries console will be faster since it can send up to 200 bytes at
a time to the Hypervisor.  This only affects the tty part of the console,
the console writes are still in 16 byte lots.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
drivers/char/hvc_console.c
drivers/char/hvc_console.h
drivers/char/hvc_iseries.c
drivers/char/hvc_rtas.c
drivers/char/hvc_vio.c

index ca2f538e549e3fe6e87a3a850d3961e9b06ffeb9..dbee8bed05307f71911b7c690177e5cd0d6a9b73 100644 (file)
@@ -80,7 +80,8 @@ struct hvc_struct {
        struct tty_struct *tty;
        unsigned int count;
        int do_wakeup;
-       char outbuf[N_OUTBUF] __ALIGNED__;
+       char *outbuf;
+       int outbuf_size;
        int n_outbuf;
        uint32_t vtermno;
        struct hv_ops *ops;
@@ -505,7 +506,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
        if (hp->n_outbuf > 0)
                hvc_push(hp);
 
-       while (count > 0 && (rsize = N_OUTBUF - hp->n_outbuf) > 0) {
+       while (count > 0 && (rsize = hp->outbuf_size - hp->n_outbuf) > 0) {
                if (rsize > count)
                        rsize = count;
                memcpy(hp->outbuf + hp->n_outbuf, buf, rsize);
@@ -538,7 +539,7 @@ static int hvc_write_room(struct tty_struct *tty)
        if (!hp)
                return -1;
 
-       return N_OUTBUF - hp->n_outbuf;
+       return hp->outbuf_size - hp->n_outbuf;
 }
 
 static int hvc_chars_in_buffer(struct tty_struct *tty)
@@ -728,12 +729,13 @@ static struct kobj_type hvc_kobj_type = {
 };
 
 struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int irq,
-                                       struct hv_ops *ops)
+                                       struct hv_ops *ops, int outbuf_size)
 {
        struct hvc_struct *hp;
        int i;
 
-       hp = kmalloc(sizeof(*hp), GFP_KERNEL);
+       hp = kmalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
+                       GFP_KERNEL);
        if (!hp)
                return ERR_PTR(-ENOMEM);
 
@@ -742,6 +744,8 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int irq,
        hp->vtermno = vtermno;
        hp->irq = irq;
        hp->ops = ops;
+       hp->outbuf_size = outbuf_size;
+       hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))];
 
        kobject_init(&hp->kobj);
        hp->kobj.ktype = &hvc_kobj_type;
index 96b7401319c19650fed079edeb8f12dce760f886..8c59818050e66d0c6c97aa8bb22351bf7bd70e5b 100644 (file)
@@ -56,7 +56,7 @@ extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops);
 
 /* register a vterm for hvc tty operation (module_init or hotplug add) */
 extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int irq,
-                                                struct hv_ops *ops);
+                               struct hv_ops *ops, int outbuf_size);
 /* remove a vterm from hvc tty operation (modele_exit or hotplug remove) */
 extern int __devexit hvc_remove(struct hvc_struct *hp);
 
index 256afc8e583825ced0bc060f4c9fba85c09ff65a..4747729459c7a5a0c0aa29f9ec8a7023d73fc66a 100644 (file)
@@ -221,7 +221,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev,
 
        pi = &port_info[vdev->unit_address];
 
-       hp = hvc_alloc(vdev->unit_address, vdev->irq, &hvc_get_put_ops);
+       hp = hvc_alloc(vdev->unit_address, vdev->irq, &hvc_get_put_ops,
+                       VIOCHAR_MAX_DATA);
        if (IS_ERR(hp))
                return PTR_ERR(hp);
        pi->hp = hp;
index 57106e02fd2e4ac8686758ceea8e062cd4abb4c4..4b97eaf18602cbb4f139d5691c24e5a4aa5b1d71 100644 (file)
@@ -94,7 +94,7 @@ static int hvc_rtas_init(void)
 
        /* Allocate an hvc_struct for the console device we instantiated
         * earlier.  Save off hp so that we can return it on exit */
-       hp = hvc_alloc(hvc_rtas_cookie, NO_IRQ, &hvc_rtas_get_put_ops);
+       hp = hvc_alloc(hvc_rtas_cookie, NO_IRQ, &hvc_rtas_get_put_ops, 16);
        if (IS_ERR(hp))
                return PTR_ERR(hp);
 
index 9add81ceb440506340de658ed574781991928118..651e5d25f58b6437aeea17fc7f31b2cd5ed5ffc2 100644 (file)
@@ -90,7 +90,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev,
        if (!vdev || !id)
                return -EPERM;
 
-       hp = hvc_alloc(vdev->unit_address, vdev->irq, &hvc_get_put_ops);
+       hp = hvc_alloc(vdev->unit_address, vdev->irq, &hvc_get_put_ops,
+                       MAX_VIO_PUT_CHARS);
        if (IS_ERR(hp))
                return PTR_ERR(hp);
        dev_set_drvdata(&vdev->dev, hp);