[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: Stephen Rothwell <sfr@canb.auug.org.au>
This commit is contained in:
parent
8bff05b052
commit
4e9e95a355
5 changed files with 15 additions and 9 deletions
|
@ -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
|
||||||
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)
|
||||||
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 = {
|
||||||
};
|
};
|
||||||
|
|
||||||
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,
|
||||||
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);
|
||||||
|
|
||||||
/* 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,
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
/* 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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue