提交 4e9e95a3 编写于 作者: S Stephen Rothwell

[POWERPC] Make the hvc_console output buffer size settable

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: NStephen Rothwell <sfr@canb.auug.org.au>
上级 8bff05b0
...@@ -80,7 +80,8 @@ struct hvc_struct { ...@@ -80,7 +80,8 @@ struct hvc_struct {
struct tty_struct *tty; struct tty_struct *tty;
unsigned int count; unsigned int count;
int do_wakeup; int do_wakeup;
char outbuf[N_OUTBUF] __ALIGNED__; char *outbuf;
int outbuf_size;
int n_outbuf; int n_outbuf;
uint32_t vtermno; uint32_t vtermno;
struct hv_ops *ops; struct hv_ops *ops;
...@@ -505,7 +506,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count ...@@ -505,7 +506,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
if (hp->n_outbuf > 0) if (hp->n_outbuf > 0)
hvc_push(hp); 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) if (rsize > count)
rsize = count; rsize = count;
memcpy(hp->outbuf + hp->n_outbuf, buf, rsize); memcpy(hp->outbuf + hp->n_outbuf, buf, rsize);
...@@ -538,7 +539,7 @@ static int hvc_write_room(struct tty_struct *tty) ...@@ -538,7 +539,7 @@ static int hvc_write_room(struct tty_struct *tty)
if (!hp) if (!hp)
return -1; 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) static int hvc_chars_in_buffer(struct tty_struct *tty)
...@@ -728,12 +729,13 @@ static struct kobj_type hvc_kobj_type = { ...@@ -728,12 +729,13 @@ static struct kobj_type hvc_kobj_type = {
}; };
struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int irq, 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; struct hvc_struct *hp;
int i; int i;
hp = kmalloc(sizeof(*hp), GFP_KERNEL); hp = kmalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
GFP_KERNEL);
if (!hp) if (!hp)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -742,6 +744,8 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int irq, ...@@ -742,6 +744,8 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int irq,
hp->vtermno = vtermno; hp->vtermno = vtermno;
hp->irq = irq; hp->irq = irq;
hp->ops = ops; hp->ops = ops;
hp->outbuf_size = outbuf_size;
hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))];
kobject_init(&hp->kobj); kobject_init(&hp->kobj);
hp->kobj.ktype = &hvc_kobj_type; hp->kobj.ktype = &hvc_kobj_type;
......
...@@ -56,7 +56,7 @@ extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops); ...@@ -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) */ /* register a vterm for hvc tty operation (module_init or hotplug add) */
extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int irq, 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) */ /* remove a vterm from hvc tty operation (modele_exit or hotplug remove) */
extern int __devexit hvc_remove(struct hvc_struct *hp); extern int __devexit hvc_remove(struct hvc_struct *hp);
......
...@@ -221,7 +221,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev, ...@@ -221,7 +221,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev,
pi = &port_info[vdev->unit_address]; 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)) if (IS_ERR(hp))
return PTR_ERR(hp); return PTR_ERR(hp);
pi->hp = hp; pi->hp = hp;
......
...@@ -94,7 +94,7 @@ static int hvc_rtas_init(void) ...@@ -94,7 +94,7 @@ static int hvc_rtas_init(void)
/* Allocate an hvc_struct for the console device we instantiated /* Allocate an hvc_struct for the console device we instantiated
* earlier. Save off hp so that we can return it on exit */ * 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)) if (IS_ERR(hp))
return PTR_ERR(hp); return PTR_ERR(hp);
......
...@@ -90,7 +90,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev, ...@@ -90,7 +90,8 @@ static int __devinit hvc_vio_probe(struct vio_dev *vdev,
if (!vdev || !id) if (!vdev || !id)
return -EPERM; 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)) if (IS_ERR(hp))
return PTR_ERR(hp); return PTR_ERR(hp);
dev_set_drvdata(&vdev->dev, hp); dev_set_drvdata(&vdev->dev, hp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册