Skip to content

Commit

Permalink
[POWERPC] Make the hvc_console output buffer size settable
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephen Rothwell committed Jul 13, 2006
1 parent 8bff05b commit 4e9e95a
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 9 deletions.
14 changes: 9 additions & 5 deletions drivers/char/hvc_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);

Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/char/hvc_console.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion drivers/char/hvc_iseries.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/char/hvc_rtas.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion drivers/char/hvc_vio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 4e9e95a

Please sign in to comment.