uart must be ilocked, to prevent deadlock with uartclock Reference: /n/patches.lsub.org/patch/uartilock Date: Sun Sep 16 17:17:33 CES 2012 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/port/devuart.c Thu Apr 12 12:26:28 2012 +++ /sys/src/nix/port/devuart.c Sun Sep 16 16:11:34 2012 @@ -89,7 +89,7 @@ uartctl(p, "b9600"); (*p->phys->enable)(p, 1); - lock(&uartalloc); + ilock(&uartalloc); for(l = &uartalloc.elist; *l; l = &(*l)->elist){ if(*l == p) break; @@ -99,7 +99,7 @@ uartalloc.elist = p; } p->enabled = 1; - unlock(&uartalloc); + iunlock(&uartalloc); return p; } @@ -111,7 +111,7 @@ (*p->phys->disable)(p); - lock(&uartalloc); + ilock(&uartalloc); for(l = &uartalloc.elist; *l; l = &(*l)->elist){ if(*l == p){ *l = p->elist; @@ -119,7 +119,7 @@ } } p->enabled = 0; - unlock(&uartalloc); + iunlock(&uartalloc); } Uart* @@ -197,7 +197,7 @@ uartndir = 1 + 3*uartnuart; uartdir = malloc(uartndir * sizeof(Dirtab)); - if(uartnuart > 0 && uart == nil || uartdir == nil) + if(uart == nil || uartdir == nil) panic("uartreset: no memory"); dp = uartdir; strcpy(dp->name, "."); @@ -307,7 +307,7 @@ static void uartdrainoutput(Uart *p) { - if(!p->enabled) + if(!p->enabled || up == nil) return; p->drain = 1; @@ -722,7 +722,7 @@ { Uart *p; - lock(&uartalloc); + ilock(&uartalloc); for(p = uartalloc.elist; p; p = p->elist){ if(p->phys->poll != nil) @@ -752,7 +752,7 @@ iunlock(&p->tlock); } } - unlock(&uartalloc); + iunlock(&uartalloc); } /*