Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 98975
b: refs/heads/master
c: ad21179
h: refs/heads/master
i:
  98973: 5a80aa6
  98971: 4e696cc
  98967: ce159be
  98959: a8bfc1e
  98943: 63c9f5c
v: v3
  • Loading branch information
Peter Oberparleiter authored and Heiko Carstens committed Jul 14, 2008
1 parent d8b7aa3 commit 77b6f3b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 773922e1dab93a62e60cfb34afadb0f66d5f12e9
refs/heads/master: ad211790c040fae3459e9c4c8cbd681ae126d2b8
55 changes: 28 additions & 27 deletions trunk/drivers/s390/char/sclp_vt220.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ static struct sclp_vt220_request *sclp_vt220_current_request;
/* Number of characters in current request buffer */
static int sclp_vt220_buffered_chars;

/* Flag indicating whether this driver has already been initialized */
static int sclp_vt220_initialized = 0;
/* Counter controlling core driver initialization. */
static int __initdata sclp_vt220_init_count;

/* Flag indicating that sclp_vt220_current_request should really
* have been already queued but wasn't because the SCLP was processing
Expand Down Expand Up @@ -609,10 +609,8 @@ sclp_vt220_flush_buffer(struct tty_struct *tty)
sclp_vt220_emit_current();
}

/*
* Initialize all relevant components and register driver with system.
*/
static void __init __sclp_vt220_cleanup(void)
/* Release allocated pages. */
static void __init __sclp_vt220_free_pages(void)
{
struct list_head *page, *p;

Expand All @@ -623,21 +621,30 @@ static void __init __sclp_vt220_cleanup(void)
else
free_bootmem((unsigned long) page, PAGE_SIZE);
}
if (!list_empty(&sclp_vt220_register.list))
sclp_unregister(&sclp_vt220_register);
sclp_vt220_initialized = 0;
}

static int __init __sclp_vt220_init(void)
/* Release memory and unregister from sclp core. Controlled by init counting -
* only the last invoker will actually perform these actions. */
static void __init __sclp_vt220_cleanup(void)
{
sclp_vt220_init_count--;
if (sclp_vt220_init_count != 0)
return;
sclp_unregister(&sclp_vt220_register);
__sclp_vt220_free_pages();
}

/* Allocate buffer pages and register with sclp core. Controlled by init
* counting - only the first invoker will actually perform these actions. */
static int __init __sclp_vt220_init(int num_pages)
{
void *page;
int i;
int num_pages;
int rc;

if (sclp_vt220_initialized)
sclp_vt220_init_count++;
if (sclp_vt220_init_count != 1)
return 0;
sclp_vt220_initialized = 1;
spin_lock_init(&sclp_vt220_lock);
INIT_LIST_HEAD(&sclp_vt220_empty);
INIT_LIST_HEAD(&sclp_vt220_outqueue);
Expand All @@ -649,24 +656,22 @@ static int __init __sclp_vt220_init(void)
sclp_vt220_flush_later = 0;

/* Allocate pages for output buffering */
num_pages = slab_is_available() ? MAX_KMEM_PAGES : MAX_CONSOLE_PAGES;
for (i = 0; i < num_pages; i++) {
if (slab_is_available())
page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
else
page = alloc_bootmem_low_pages(PAGE_SIZE);
if (!page) {
__sclp_vt220_cleanup();
return -ENOMEM;
rc = -ENOMEM;
goto out;
}
list_add_tail((struct list_head *) page, &sclp_vt220_empty);
}
rc = sclp_register(&sclp_vt220_register);
out:
if (rc) {
printk(KERN_ERR SCLP_VT220_PRINT_HEADER
"could not register vt220 - "
"sclp_register returned %d\n", rc);
__sclp_vt220_cleanup();
__sclp_vt220_free_pages();
sclp_vt220_init_count--;
}
return rc;
}
Expand All @@ -689,15 +694,13 @@ static int __init sclp_vt220_tty_init(void)
{
struct tty_driver *driver;
int rc;
int cleanup;

/* Note: we're not testing for CONSOLE_IS_SCLP here to preserve
* symmetry between VM and LPAR systems regarding ttyS1. */
driver = alloc_tty_driver(1);
if (!driver)
return -ENOMEM;
cleanup = !sclp_vt220_initialized;
rc = __sclp_vt220_init();
rc = __sclp_vt220_init(MAX_KMEM_PAGES);
if (rc)
goto out_driver;

Expand All @@ -723,8 +726,7 @@ static int __init sclp_vt220_tty_init(void)
return 0;

out_init:
if (cleanup)
__sclp_vt220_cleanup();
__sclp_vt220_cleanup();
out_driver:
put_tty_driver(driver);
return rc;
Expand Down Expand Up @@ -773,10 +775,9 @@ sclp_vt220_con_init(void)
{
int rc;

INIT_LIST_HEAD(&sclp_vt220_register.list);
if (!CONSOLE_IS_SCLP)
return 0;
rc = __sclp_vt220_init();
rc = __sclp_vt220_init(MAX_CONSOLE_PAGES);
if (rc)
return rc;
/* Attach linux console */
Expand Down

0 comments on commit 77b6f3b

Please sign in to comment.