Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Dec 1995 13:36:59 +0500 (GMT+0500)
From:      "Serge A. Babkin" <babkin@hq.icb.chel.su>
To:        bde@zeta.org.au (Bruce Evans)
Cc:        hackers@freebsd.org
Subject:   Re: Digiboard patch
Message-ID:  <199512260836.NAA25821@hq.icb.chel.su>
In-Reply-To: <199512221447.BAA14659@godzilla.zeta.org.au> from "Bruce Evans" at Dec 23, 95 01:47:02 am

next in thread | previous in thread | raw e-mail | index | archive | help
> This was slightly better before.  The comment no longer matches the code.
> But to be correct, the state should be left at DC_UNCONFIGURED when the
> device is first registered, then set to DC_BUSY when a subdevice is
> attached (since you're not bothering to keep track of opens).
> 
> Note that setting DC_* in kdc_dgb[0].kdc_state clobbers the template.
> In general you have to worry about all the fields in the template being
> changed as device 0 is attached, used and detached, so the template
> shouldn't be in kdc_xxx[0].  This bug has been copied into about 100
> drivers :-(.

This patch must fix these problems. Commit it please (if you think that
it is worth). Thank you!

----------------------------------- cut here ---------------------------
*** dgb.c	1995/12/22 11:09:12
--- dgb.c	1995/12/26 08:26:21
***************
*** 427,433 ****
  	return 4; /* we need I/O space of 4 ports */
  }
  
! static struct kern_devconf kdc_dgb[NDGB] = { {
  	0, 0, 0,		/* filled in by dev_attach */
  	"dgb", 0, { MDDT_ISA, 0, "tty" },
  	isa_generic_externalize, 0, 0, ISA_EXTERNALLEN,
--- 427,434 ----
  	return 4; /* we need I/O space of 4 ports */
  }
  
! static struct kern_devconf kdc_dgb[NDGB];
! static struct kern_devconf kdc_dgb_init =  {
  	0, 0, 0,		/* filled in by dev_attach */
  	"dgb", 0, { MDDT_ISA, 0, "tty" },
  	isa_generic_externalize, 0, 0, ISA_EXTERNALLEN,
***************
*** 436,442 ****
  	DC_UNCONFIGURED,
  	"DigiBoard multiport card",
  	DC_CLS_SERIAL,
! } };
  
  static void
  dgbregisterdev(id)
--- 437,443 ----
  	DC_UNCONFIGURED,
  	"DigiBoard multiport card",
  	DC_CLS_SERIAL,
! };
  
  static void
  dgbregisterdev(id)
***************
*** 445,457 ****
  	int	unit;
  
  	unit = id->id_unit;
! 	if (unit != 0)
! 		kdc_dgb[unit] = kdc_dgb[0];
  	kdc_dgb[unit].kdc_unit = unit;
  	kdc_dgb[unit].kdc_isa = id;
  
! 	/* now we assume that multiport is always 'open' for simplicity */
! 	kdc_dgb[unit].kdc_state = DC_UNKNOWN;
  	dev_attach(&kdc_dgb[unit]);
  }
  
--- 446,457 ----
  	int	unit;
  
  	unit = id->id_unit;
! 	kdc_dgb[unit] = kdc_dgb_init;
  	kdc_dgb[unit].kdc_unit = unit;
  	kdc_dgb[unit].kdc_isa = id;
  
! 	/* no ports are open yet */
! 	kdc_dgb[unit].kdc_state = DC_IDLE;
  	dev_attach(&kdc_dgb[unit]);
  }
  
***************
*** 1037,1042 ****
--- 1037,1048 ----
  		port->active_out = TRUE;
  
  	port->used=1;
+ 
+ 	/* If any port is open (i.e. the open() call is completed for it) 
+ 	 * the device is busy
+ 	 */
+ 
+ 	kdc_dgb[unit].kdc_state = DC_BUSY;
  	
  out:
  	splx(s);
***************
*** 1063,1068 ****
--- 1069,1075 ----
  	struct dgb_softc *sc;
  	struct dgb_p *port;
  	int s;
+ 	int i;
  
  	mynor=minor(dev);
  	unit=MINOR_TO_UNIT(mynor);
***************
*** 1086,1091 ****
--- 1093,1107 ----
  	ttyclose(tp);
  	port->closing=0; wakeup(&port->closing);
  	port->used=0;
+ 
+ 	/* mark the card idle when all ports are closed */
+ 
+ 	for(i=0; i<sc->numports; i++)
+ 		if(sc->ports[i].used)
+ 			break;
+ 
+ 	if(i>= sc->numports)
+ 		kdc_dgb[unit].kdc_state = DC_IDLE;
  
  	splx(s);
  



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512260836.NAA25821>